根据对象的属性合并C#列表元素

时间:2018-03-19 07:49:11

标签: c# list join elements

我在C#中有一个列表。列出User对象参数很少的位置。用户名,年龄类似的东西。 在列表中,根据用户名存在重复(仅两次)实体。 Eventhoug用户名相同,其他属性不相同。

如何合并这些元素并删除该列表中元素的重复项。

P.S:尽管根据用户名存在重复的实体,其他atteributes在一个元素中为空,而其他元素具有这些属性的值。

3 个答案:

答案 0 :(得分:2)

var duplicates = Users
    .GroupBy(u => u.UserName)
    .Where(g => g.Count() > 1)
    .ToList();

现在每个成员都是具有相同UserName的IEnumerable

foreach(var duplicate in duplicates)
{
   // write some logic to combine >= 2 Users
   // and remove all but 1 from original Users

   // a rough idea:
   var main = duplicate.First();
   foreach(var user in duplicate.Skip(1))
   {
      // merge user with main
      ....
      toDeleteList.Add(user);
   }
}

答案 1 :(得分:1)

您可以使用IEqualityComparer

internal class UserEqualChecker : IEqualityComparer<User>
{
    public bool Equals(User x, User y)
    {
        //Code for what makes them equal
        //for instance 
        return x.UserName.Equals(y.UserName, System.StringComparison.OrdinalIgnoreCase);
    }

    //.....
}

然后......

var list = new List<User>();
//put the data into the list...
list.Distinct(new UserEqualChecker());

这样,您就拥有了可重复使用的比较器

答案 2 :(得分:0)

您可以使用linq对列表进行分组,然后使用合并数据创建一个新对象:

var merged = from item in mylist
             group item by item.UserName into grp
             select new YourClass { 
                 Username = grp.Key,
                 Proeperty1 = grp.Where(g => g.Porperty1 != null).FirstOrDefault(),
                 Property2 = ...
             }

这假设用户名是CaseSensitive,您可以使用UserName.Toupper()或类似的东西来更改组...

正如@HenkHolterman所说,您必须定义属性的选择值。

我为Prperty1写的规则只是一个例子......