使用linq选择不同的[重复]
Posted
技术标签:
【中文标题】使用linq选择不同的[重复]【英文标题】:Select distinct using linq [duplicate] 【发布时间】:2013-10-24 17:37:22 【问题描述】:我有一个班级列表
public class LinqTest
public int id get; set;
public string value get; set;
List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() id = 1, value = "a" );
myList.Add(new LinqTest() id = 1, value = "b" );
myList.Add(new LinqTest() id = 2, value = "c" );
我只需要从该列表中选择不同的 id。 即,我的结果列表应该只包含
[id=1,value="a", id = 2, value = "c" ]
我怎样才能用 linq 做到这一点?
编辑
输入,
id value
1 a
1 b
2 c
3 d
3 e
输出应该是,
id value
1 a
2 c
3 d
即,如果有重复的id
,结果应该只取第一次出现。
【问题讨论】:
为什么结果应该包含"a"
而不是"b"
?
@Jodrell : 它应该包含第一个值。
【参考方案1】:
使用morelinq可以使用DistinctBy
:
myList.DistinctBy(x => x.id);
否则,您可以使用组:
myList.GroupBy(x => x.id)
.Select(g => g.First());
【讨论】:
不知道这个包绝对需要什么好人 哪个更快? DistinctBy () 在 .Net 5 中不再存在 @MarkWardell:DistinctBy
在 .NET 中从未存在过。正如我在回答中所写,您需要使用 morelinq 来获得该功能【参考方案2】:
myList.GroupBy(test => test.id)
.Select(grp => grp.First());
编辑:将这个IEnumerable<>
变成List<>
对很多人来说似乎是个谜,你可以简单地写:
var result = myList.GroupBy(test => test.id)
.Select(grp => grp.First())
.ToList();
但是使用IEnumerable
而不是IList
通常会更好,因为上面的Linq 是懒惰地评估的:在迭代可枚举之前它实际上并没有完成所有工作。当您致电ToList
时,它实际上会遍历整个可枚举项,从而强制所有工作提前完成。 (如果您的可枚举项无限长,则可能需要一点时间。)
此建议的另一面是,每次您枚举这样的IEnumerable
时,都必须重新进行评估工作。因此,您需要针对每种情况决定是使用懒惰评估的IEnumerable
还是将其实现为List
、Set
、Dictionary
或诸如此类更好。
【讨论】:
仅供参考:除非您再次将其转换回列表,否则这将不起作用。 GroupBy().Select(First()) 将生成一个 ienumerable 并且你会得到一个转换错误。这样做: myList.GroupBy(test => test.id) .Select(group => group.First()).ToList(); 你必须定义newList。然后将结果设置为此 newList。否则分组不起作用。这对我有用。 'List newList = new List(); newList = myList.GroupBy(test => test.id) .Select(group => group.First());' 嘿尤努斯。谢谢你的小评论。通过使用您的代码并更改列表内容,我能够让我的 IEnumerable 工作: IEnumerable你应该有意义地覆盖Equals
和GetHashCode
,在这种情况下比较ID:
public class LinqTest
public int id get; set;
public string value get; set;
public override bool Equals(object obj)
LinqTest obj2 = obj as LinqTest;
if (obj2 == null) return false;
return id == obj2.id;
public override int GetHashCode()
return id;
现在你可以使用Distinct
:
List<LinqTest> uniqueIDs = myList.Distinct().ToList();
【讨论】:
【参考方案4】:myList.GroupBy(i => i.id).Select(group => group.First())
【讨论】:
以上是关于使用linq选择不同的[重复]的主要内容,如果未能解决你的问题,请参考以下文章