我有一个这样的课:
class MyClass<T> {
public string value1 { get; set; }
public T objT { get; set; }
}
以及这个 class 的清单 . 我想使用.net 3.5 lambda或linq来获取不同value1的MyClass列表 . 我想这可能比在.net 2.0中缓存这样的列表的方式简单得多:
List<MyClass<T>> list;
...
List<MyClass<T>> listDistinct = new List<MyClass<T>>();
foreach (MyClass<T> instance in list)
{
// some code to check if listDistinct does contain obj with intance.Value1
// then listDistinct.Add(instance);
}
lambda或LINQ的做法是什么?
7 回答
Marc 和 dahlbyk 的答案似乎都很有效 . 我有一个更简单的解决方案 . 您可以使用
GroupBy
而不是Distinct
. 它是这样的:请注意,我已将两个函数传递给
GroupBy()
. 第一个是键选择器 . 第二个只从每个组中获得一个项目 . 从你的问题来看,我认为First()
是正确的 . 如果你愿意,你可以写一个不同的 . 你可以试试Last()
看看我的意思 .我使用以下输入运行测试:
结果是:
我没有测试它的性能 . 我相信这个解决方案可能比使用
Distinct
的解决方案慢一点 . 尽管有这个缺点,但有两个很大的优点:简单和灵活 . 通常,最好是简化优于优化,但它实际上取决于您尝试解决的问题 .嗯......我可能会写一个自定义的
IEqualityComparer<T>
以便我可以使用:并通过LINQ编写比较器....
可能有点矫枉过正,但可重复使用,至少:
用法优先:
用实用方法:
您可以使用此扩展方法:
查看Enumerable.Distinct(),它可以接受IEqualityComparer:
您的代码段可能如下所示:
这会更简单......
在linq中,这更适合群体
我接受了Marc的回答,修复它以使用TSource作为值类型(默认测试(TSource)而不是null),清理了一些冗余类型规范,并为它编写了一些测试 . 这是我今天使用的 . 谢谢Marc的好主意和实施 .
和测试类: