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

时间:2018-11-16 11:53:53

标签: c# linq

考虑以下类别的列表:

class A
{
    string Id;
    string FamilyId
    int Score
}

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

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

>

  

ID,家庭,得分

     

1,A,0

     

2,B,2

     

3,B,3

最终列表应为:

  

ID,家庭,得分

     

1,A,0

     

3,B,3

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

3 个答案:

答案 0 :(得分:4)

GroupByOrderByDescendingFirst是您的朋友:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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