繁体   English   中英

如何使用Linq在C#中删除列表中的重复项,同时保留重复项中得分最高的元素

[英]How to remove duplicates in a list while keeping elements with highest scores among duplicates, in C# with Linq

考虑以下类别的列表:

class A
{
    string Id;
    string FamilyId
    int Score
}

我想处理列表,以便将具有重复的FamilyId字段的元素减少为列表中的单个实例; 消除重复时,最高分是我想要保留的。

例如,如果我具有以下元素:

>

身份证,家庭,分数

1、0

2 B 2

3,B,3

最终列表应为:

身份证,家庭,分数

1、0

3,B,3

我曾考虑过按家族对列表进行排序,然后仅保留每个bin的第一个元素,但我不知道如何实现此功能的LinQ实现。

GroupByOrderByDescendingFirst是您的朋友:

list = list.GroupBy(x => x.FamilyId)
           .Select(g => g.OrderByDescending(x => x.Score).First())
           .ToList();

请注意,如果有多个具有最大得分的情况,则这将是任意的第一个。

            List<A> myList = getYourListForWhereEver();
            var filteredList = new List<A>();
            foreach (var item in myList)
            {
                var existing = filteredList.FirstOrDefault(x => x.familyId == item.familyId);
                if (existing == null)
                {

                    // family is unique so add it
                    filteredList.Add(item);

                }
                else
                {
                    // check the score and replace if score is lower
                    if (existing.Score < item.Score)
                    {
                        filteredList.Remove(existing);
                        filteredList.Add(item);
                    }
                }
            }

上面将建立一个过滤列表(请不要复制粘贴,因为它可能有错别字)。 基本上要通过所有现有的家庭得分。 将分数添加到过滤列表(如果尚不存在);如果存在,则检查分数并替换值;

这与提供的解决方案@TimSchmelter非常相似,但是您也可以使用GroupBy的结果选择器:

var sortedGrouped = list.GroupBy(k => k.FamilyId, 
                                (key, g) => g.OrderByDescending(e => e.Score).First());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM