考虑以下类别的列表:
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实现。
答案 0 :(得分:4)
GroupBy
,OrderByDescending
和First
是您的朋友:
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());