我在C#中有一个列表。列出User对象参数很少的位置。用户名,年龄类似的东西。 在列表中,根据用户名存在重复(仅两次)实体。 Eventhoug用户名相同,其他属性不相同。
如何合并这些元素并删除该列表中元素的重复项。
P.S:尽管根据用户名存在重复的实体,其他atteributes在一个元素中为空,而其他元素具有这些属性的值。
答案 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写的规则只是一个例子......