我意识到我的标题可能不是很清楚所以这是一个例子:
我有一个具有两个属性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的表现力,并且很想知道它是否可以做得更好.
怎么样:
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).