【问题标题】:C# Linq- How to get distinct collection from a collection [duplicate]C#Linq-如何从集合中获取不同的集合[重复]
【发布时间】:2013-12-05 18:43:10
【问题描述】:

我有以下收藏:

public IList<Emp> EmpList()
{
    IList<Emp> empList = new List<Emp>();
    empList.Add(new Emp() { Id = 1, Name = "abc1" });
    empList.Add(new Emp() { Id = 1, Name = "abc2" });        
    empList.Add(new Emp() { Id = 2, Name = "abc3" });
    empList.Add(new Emp() { Id = 2, Name = "abc4" });
    empList.Add(new Emp() { Id = 4, Name = "abc5" });
    return empList;
}

我想从 EmpList() 集合中获取基于 Id 的不同记录。我的意思是EmpList() 集合中的第一行、第三行和最后一行。

任何帮助将不胜感激。

编辑-var empList = emp.EmpList().GroupBy(x =&gt; x.Id).Select(x =&gt; x.First()); 此查询适用于解决方案。

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    你可以使用这个,来自MoreLINQ

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
    

    并像这样使用它:

    return empList.DistinctBy(x => x.Id).ToList();
    

    【讨论】:

    • 是否有任何替代解决方案,因为我不想使用 MoreLinq。
    • @mnmnmnmnm 您可以将此代码粘贴为扩展方法并按照我的建议使用它。要使用扩展方法,你需要有静态类:EnumerableExtensions 并把这个方法放在那里
    • !wudzik,是的,我知道了,但是我在这里粘贴了示例,但在实际场景中我必须在 Vb.Net 中实现它,我猜 Vb.net 不支持扩展方法 :(
    • @mnmnmnmnm 嗯?当然 VB.Net 支持扩展方法。
    • @mnmnmnmnm msdn.microsoft.com/en-us/library/bb384936.aspx 在此处查找 vb 中的扩展方法
    【解决方案2】:
    var q = from e in empList
            group e by e.Id into grps
            select grps.First();
    

    【讨论】:

    • 不完整,因为问题没有提供更多信息。
    • 人们为什么无缘无故投反对票???
    • 是的,它没有编译:(
    • +1 来吧,错字soooo 很明显。它只是在grp 上缺少一个 s。现在的人不能思考吗?分组并取每个组的第一个元素是一种简单的方法来做一个“distinct-by”。
    猜你喜欢
    • 2021-05-31
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多