如何通过 Lambda 或 LINQ 从列表中获取不同的实例
我有一个这样的课程:
class MyClass<T> {
public string value1 { get; set; }
public T objT { get; set; }
}
以及该课程的列表。 我想使用 .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);
}
What is the lambda or LINQ way to do it?
I have a class like this:
class MyClass<T> {
public string value1 { get; set; }
public T objT { get; set; }
}
and a list of this class. I would like to use .net 3.5 lambda or linq to get a list of MyClass by distinct value1. I guess this is possible and much simpler than the way in .net 2.0 to cache a list like this:
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);
}
What is the lambda or LINQ way to do it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
Marc 和 dahlbyk 的答案似乎都非常有效。 不过我有一个更简单的解决方案。 您可以使用
GroupBy
,而不是使用Distinct
。 它是这样的:请注意,我已将两个函数传递给
GroupBy()
。 第一个是键选择器。 第二个只从每组中获取一项。 根据您的问题,我认为First()
是正确的。 如果您愿意,可以写一个不同的。 你可以尝试Last()
来看看我的意思。我使用以下输入进行了测试:
结果是:
我还没有测试它的性能。 我相信这个解决方案可能比使用
Distinct
的解决方案慢一点。 尽管有这个缺点,但它有两个很大的优点:简单性和灵活性。 通常,优先考虑简单性而不是优化,但这实际上取决于您要解决的问题。Both Marc's and dahlbyk's answers seem to work very well. I have a much simpler solution though. Instead of using
Distinct
, you can useGroupBy
. It goes like this:Notice that I've passed two functions to the
GroupBy()
. The first is a key selector. The second gets only one item from each group. From your question, I assumedFirst()
was the right one. You can write a different one, if you want to. You can tryLast()
to see what I mean.I ran a test with the following input:
The result was:
I haven't tested it for performance. I believe that this solution is probably a little bit slower than one that uses
Distinct
. Despite this disadvantage, there are two great advantages: simplicity and flexibility. Usually, it's better to favor simplicity over optimization, but it really depends on the problem you're trying to solve.自定义
IEqualityComparer
以便我可以使用:并通过 LINQ 编写比较器...
可能有点过头了,但至少可以重用:
嗯...我可能会编写一个 第一:
使用实用方法:
Hmm... I'd probably write a custom
IEqualityComparer<T>
so that I can use:and write the comparer via LINQ....
Possibly a bit overkill, but reusable, at least:
Usage first:
With utility methods:
您可以使用此扩展方法:
You can use this extension method:
查看 Enumerable.Distinct(),它可以接受 IEqualityComparer:
您的代码片段可能如下所示:
Check out Enumerable.Distinct(), which can accept an IEqualityComparer:
Your code snippet could look like this:
这样会更简单...
This will be more simple...
在 linq 中,这比分组更先进
In linq this is more advance to group
从 .NET 6 开始,新的 DistinctBy 运算符。 现在我们可以这样写:
这是 源代码中的实现 如果有人感兴趣的话。
As of .NET 6 a new DistinctBy operator has been introduced. So now we can write:
Here's the implementation in the source code if anyone's interested.
我采纳了 Marc 的答案,将其修复为与 TSource 作为值类型一起使用(测试默认(TSource)而不是 null),清理了一些冗余的类型规范,并为其编写了一些测试。 这是我今天使用的。 感谢马克的好主意和实施。
和测试类:
I took Marc's answer, fixed it to work with TSource being a value type (test for default(TSource) instead of null), cleaned up some redundant type specifications, and wrote some tests for it. Here is what I am using today. Thank you Marc for the great idea and implementation.
And the test class: