根据列表的值清理List with Linq中的某些属性值
我有一个对象“ MyObject
”与属性(所有字符串):“ PropA
”,“ PropB
”和“ PropC
”。
var List = new List();
我用下面的值在这个列表中添加一些对象:
List.Add(new MyObject { PropA = "AA", PropB = "1", PropC = "TT"});
List.Add(new MyObject { PropA = "AA", PropB = "1", PropC = "TT"});
List.Add(new MyObject { PropA = "AA", PropB = "1", PropC = "TT"});
List.Add(new MyObject { PropA = "BB", PropB = "1", PropC = "TT"});
List.Add(new MyObject { PropA = "BB", PropB = "1", PropC = "TT"});
用linq,我想为每个不同的“ PropA
”保留第一条记录,但设置为string.Empty其他。 我想要的结果是带有这些值的列表:
MyObject { PropA = "AA", PropB = "1", PropC = "TT"}
MyObject { PropA = "", PropB = "", PropC = "TT"}
MyObject { PropA = "", PropB = "", PropC = "TT"}
MyObject { PropA = "BB", PropB = "1", PropC = "TT"}
MyObject { PropA = "", PropB = "", PropC = "TT"}
我用foreach做了,但在Linq中可能会更清洁一些,但是结果的顺序必须保持。
这将适用于特定情况:
var list =
List.GroupBy(x => x.PropA)
.SelectMany(grp => new MyObject[] { grp.First() }
.Concat(grp.Skip(1)
.Select(x => { x.PropA = String.Empty; x.PropB = String.Empty; return x; } )
)
);
LinqPad结果:
作为一个方面说明,我认为在这种情况下使用Linq并不合理,它不会使代码更快或更清晰。 我们必须使用可用的工具来编写更好,更高性能或更清晰的代码,但在这种情况下,我认为这不比任何foreach
更好(至少是一种深思熟虑的foreach
,而不是暴力)可能的方式。
这个怎么样:
var result = List.GroupBy(prop => prop.PropA)
.SelectMany(group => new [] { group.First() }.Concat(group.Skip(1).Select(x => { x.PropA = x.PropB = ""; return x; }))).ToList();
var groups = List.GroupBy(obj => obj.PropA);
foreach (var group in groups)
{
foreach (var item in group.Skip(1))
{
item.PropA = "";
item.PropB = "";
}
}
链接地址: http://www.djcxy.com/p/51357.html
上一篇: Clean some properties value in List with Linq based on a value of the list
下一篇: Returning value of a property of an object that is not null