使用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&lt;&gt; 变成List&lt;&gt; 对很多人来说似乎是个谜,你可以简单地写:

var result = myList.GroupBy(test => test.id)
                   .Select(grp => grp.First())
                   .ToList();

但是使用IEnumerable 而不是IList 通常会更好,因为上面的Linq 是懒惰地评估的:在迭代可枚举之前它实际上并没有完成所有工作。当您致电ToList 时,它实际上会遍历整个可枚举项,从而强制所有工作提前完成。 (如果您的可枚举项无限长,则可能需要一点时间。)

此建议的另一面是,每次您枚举这样的IEnumerable 时,都必须重新进行评估工作。因此,您需要针对每种情况决定是使用懒惰评估的IEnumerable 还是将其实现为ListSetDictionary 或诸如此类更好。

【讨论】:

仅供参考:除非您再次将其转换回列表,否则这将不起作用。 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 rows = from c in dc.EDI_RAW_TCRs where c.Batch_ID == 20830 select c; IEnumerable raws = 行; raws = rows.GroupBy(t => t.LabID) .Select(group => group.First()); 在 C# 中它需要 .FirstOrDefault() 而不是 .First() @Sruit,C# 不需要这个,但是如果你尝试在存储库中这样做,你的 EF 可能会让你有些头疼。【参考方案3】:

你应该有意义地覆盖EqualsGetHashCode,在这种情况下比较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选择不同的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 对不同的值进行排序 [重复]

LINQ按名称选择属性[重复]

使用 LINQ 选择单个列表的所有唯一组合,不重复

使用 LINQ 选择单个列表的所有唯一组合,不重复

与 LINQ 的类的属性不同 [重复]

Linq distinct 方法仅适用于特定属性[重复]