c# - 如何使用 LINQ 查询列表 <T>

标签 c# linq generics

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)成员 QualificiationIDProductID,您可以执行以下操作:

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/

相关文章:

c# - 使用 javascript 值和 doPostback?

c# - 这个 ToArray() 实现如何更优化?

javascript - 是否可以像来自用户一样向 Bot Framework 发送消息?

c# - C#中的多线程

c# - 选择新的和多个 GroupBy 列中的 Linq Min

java - 传递泛型类型的问题

arrays - 创建一个扩展以在 Swift 中从数组中过滤 nils

c# - 使用 LINQ 创建 JSON

c# - 如何在 Linq to SQL 中合并日期时间偏移量?

generics - 使用 Jackson 序列化 Map<Date, String>