List<T> objectList = GetList();
foreach (T setName in setNames)
{
List<T> list = objectList.Where(x => x.QualificationID == setName).ToList();
redisClient.SetAdd<string>("Qualification:" + setName, list.Select(x => x.ProductID).ToString());
}
在第 3 行中,T 不包含“QualificationID”的定义,并且找不到接受类型 T 的第一个参数的扩展方法“QualificationID”。
与第 4 行类似, T 不包含“ProductID”的定义,并且找不到接受类型 T 的第一个参数的扩展方法“ProductID”。
我们如何使用 linq 过滤通用对象列表?
编辑: 在指定类类型之前,我们发现无法在通用方法中过滤属性值。 就像将方法扩展到,
method() where T : ClassType
如答案和评论中所指定。
最佳答案
假设您有一个基类型 BaseType
,它具有公共(public)成员 QualificiationID
和 ProductID
,您可以执行以下操作:
void Foo<T>() where T : BaseType
{
List<T> objectList = GetList();
foreach (T setName in setNames)
{
List<T> list = objectList.Where(x => x.QualificationID == setName).ToList();
redisClient.SetAdd<string>("Qualification:" + setName, list.Select(x => x.ProductID).ToString());
}
}
这假设泛型类型特定于方法。如果它是类级泛型,只需将 where T : BaseType
移动到类声明中的相应位置即可。
作为次要点,您的第二个 .Select
调用的 ToString()
部分可能没有按照您认为的那样进行。 ToString
会尝试将对象转换为字符串,默认情况下会返回类型名称。这意味着您从中得到的所有内容都符合 "System.Linq.IEnumerable+WhereSelectEnumerableIterator`1"
。为了实际从 LINQ 中获取字符串,您必须将其提供给字符串构造函数并稍微更改它:
redisClient.SetAdd<string>("Qualification:" + setName, String.Join("", list.Select(x => x.ProductID.ToString()));
关于c# - 如何使用 LINQ 查询列表 <T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43715964/