我有一个问题,我相信这里有人比我想的更容易解决。我有一个有名字和号码的列表。名称是必需的,可以重复,数字只能是一个,但不是必需的。
|name|number|
|A |2 |
|A | |
|B | |
|C | |
|C | |
|D |4 |
-------------
此时我正在对名称部分执行 list.Distinct() ,但它不关心数字部分。
newlist = oldlist.Distinct().ToList();
如果一个重复的名字有一个数字,我想保留一个有数字的名字,这不会发生。不会发生两个相同名称和两个不同数字的情况。有任何想法吗?
还有一件事:此时我不关心排序,因为 distinct 会处理好这一点。
我正在添加所有代码以更好地了解 StackOverflow 团队:
class _ClientComparer : IEqualityComparer<_Client>
{
#region IEqualityComparer<_Client> Members
public bool Equals(_Client x, _Client y)
{
if ((x.ClientNumber != 0) && (y.ClientNumber != 0))//Both clients with numbers
if (x.ClientNumber == y.ClientNumber)//both clients number the same then same clients.
return true;
else //if not the same they are different
return false;
else if (x.ClientName == y.ClientName)
return true;
else
return false;
}
public int GetHashCode(_Client obj)
{
if (obj.ClientNumber != 0)
return obj.ClientNumber.GetHashCode();
else
return obj.ClientName.GetHashCode();
}
在 IEqualityComparer 实现之上和 Distinct Call 之下。
public List<_Client> CollectAllClients()
{
List<_Client> ClientList = new List<_Client>();
while (this.Read())
{
if (GetClientNumber() != 0)
ClientList.Add(CreateClientInstance());
else
ClientList.AddRange(CreateClientsInstance());
}
ClientList = ClientList.Distinct<_Client>(new _ClientComparer()).ToList<_Client>() ;
return ClientList;
}