LINQ用于获取出现次数超过1的列表

SKL*_*TFZ -2 .net c# linq

有一个List包含下面的类

public class DummyClass
{
    public string name { get; set; }
    public int value { get; set; }
    public string status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

原始列表和预期输出如下所示

在此输入图像描述

它应符合以下条件:

如果存在status = A的名称(例如A1和A2) - >删除包含相同名称和status = I的其他对等项(假设每个名称只有一个状态= A)如果名称包含许多状态=我但没有包含status = A的项目,那么只显示具有该名称的1项

它可以通过少量for循环实现并逐字删除重复的对等体.问题是否可以通过LINQ实现

Oli*_*ver 5

这个怎么样:

var list = new[]
{
    new DummyClass{ Name = "A1", Value=1, Status= "A" },
    new DummyClass{ Name = "A1", Value=2, Status= "I" },
    new DummyClass{ Name = "A2", Value=3, Status= "I" },
    new DummyClass{ Name = "A2", Value=4, Status= "I" },
    new DummyClass{ Name = "A2", Value=5, Status= "A" },
    new DummyClass{ Name = "A3", Value=6, Status= "I" },
    new DummyClass{ Name = "A3", Value=7, Status= "I" },
};

var aggregate = list
    .OrderBy(item => item.Status)
    .GroupBy(item => item.Name)
    .Select(group => group.First());

foreach (var item in aggregate)
{
    Console.WriteLine($"{item.Name} - {item.Value} - {item.Status}");
}
Run Code Online (Sandbox Code Playgroud)

它将首先按状态排序("A"出现在"I"之前),然后按给定名称分组.因此,每个组的第一个元素将是第一个"A"条目,或者如果缺少第一个"I"条目.

输出:

A1 - 1 - A.

A2 - 5 - A.

A3 - 6 - 我