根据列表的值清理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结果:

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