c# - 如何通过 Lambda 或 LINQ 从列表中获取不同的实例

标签 c# linq .net-3.5 lambda

我有这样一个类:

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);
}

lambda 或 LINQ 方法是什么?

最佳答案

Marcdahlbyk 的回答似乎都很有效。不过,我有一个更简单的解决方案。您可以使用 GroupBy 而不是使用 Distinct。它是这样的:

var listDistinct
    = list.GroupBy(
        i => i.value1,
        (key, group) => group.First()
    ).ToArray();

请注意,我已将两个函数传递给 GroupBy()。第一个是键选择器。第二个从每个组中只得到一个项目。根据您的问题,我认为 First() 是正确的。如果你愿意,你可以写一个不同的。您可以尝试 Last() 看看我的意思。

我用以下输入运行了一个测试:

var list = new [] {
    new { value1 = "ABC", objT = 0 },
    new { value1 = "ABC", objT = 1 },
    new { value1 = "123", objT = 2 },
    new { value1 = "123", objT = 3 },
    new { value1 = "FOO", objT = 4 },
    new { value1 = "BAR", objT = 5 },
    new { value1 = "BAR", objT = 6 },
    new { value1 = "BAR", objT = 7 },
    new { value1 = "UGH", objT = 8 },
};

结果是:

//{ value1 = ABC, objT = 0 }
//{ value1 = 123, objT = 2 }
//{ value1 = FOO, objT = 4 }
//{ value1 = BAR, objT = 5 }
//{ value1 = UGH, objT = 8 }

我还没有测试它的性能。我相信这个解决方案可能比使用 Distinct 的解决方案慢一点。尽管有这个缺点,但还是有两个很大的优点:简单性和灵 active 。通常,简单优于优化,但这实际上取决于您要解决的问题。

关于c# - 如何通过 Lambda 或 LINQ 从列表中获取不同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1183403/

相关文章:

c# - 重构 OrderBy 表达式

c# - WCF 4.0 SOA 提交作为事务

asp.net - 如何在 asp.net 3.5 中使用 NHibernate

generics - 解释为什么 IEnumerable 比 List 更高效

c# - Datagridview 复选框列有死区

c# - ASP.Net : Authorization issue

c# - 仅当目标属性不为 null 时才使用 DestinationValue

c# - 如何从另一个表单刷新一个表单?

Linq to Dynamics - 比较 where 子句中的两个属性

.net - 为什么 LINQ to objects 中的 Skip() 没有优化?