使用LINQ,您如何从列表中筛选出除特定条件之外的所有项目?

fre*_*red 2 c# linq

我意识到我的标题可能不是很清楚所以这是一个例子:

我有一个具有两个属性A和B的对象列表.

public class Item
{
    public int A { get; set; }
    public int B { get; set; }
}

var list = new List<Item>
{
    new Item() { A = 0, B = 0 },
    new Item() { A = 0, B = 1 },
    new Item() { A = 1, B = 0 },
    new Item() { A = 2, B = 0 },
    new Item() { A = 2, B = 1 },
    new Item() { A = 2, B = 2 },
    new Item() { A = 3, B = 0 },
    new Item() { A = 3, B = 1 },
}
Run Code Online (Sandbox Code Playgroud)

使用LINQ,将所有A = 2项目折叠成第一个A = 2项目并返回所有其他项目的最优雅方法是什么?这将是预期的结果.

var list = new List<Item>
{
    new Item() { A = 0, B = 0 },
    new Item() { A = 0, B = 1 },
    new Item() { A = 1, B = 0 },
    new Item() { A = 2, B = 0 },
    new Item() { A = 3, B = 0 },
    new Item() { A = 3, B = 1 },
}
Run Code Online (Sandbox Code Playgroud)

我不是LINQ专家,已经有一个"手动"解决方案,但我真的很喜欢LINQ的表现力,并且很想知道它是否可以做得更好.

Mat*_*and 6

怎么样:

var collapsed = list.GroupBy(i => i.A)
                    .SelectMany(g => g.Key == 2 ? g.Take(1) : g);
Run Code Online (Sandbox Code Playgroud)

我们的想法是首先对它们进行分组A,然后再次选择它们(将其展平.SelectMany)但是在Key我们想要折叠的情况下,我们只需要使用第一个条目Take(1).