У меня есть проблема, которую, я уверен, кто-то здесь решил проще, чем то, что я думаю сделать. У меня есть список, который имеет имя и номер. Имя является обязательным и может быть повторным, а номер может быть только одним, но не обязательным.
|name|number|
|A |2 |
|A | |
|B | |
|C | |
|C | |
|D |4 |
-------------
В данный момент я выполняю list.Distinct () для части имени, но не заботится о разделе номера.
newlist = oldlist.Distinct().ToList();
Если одно имя с дубликатом имеет номер, я хочу оставить имя с номером, чего не происходит. Случай двух одинаковых имен и двух разных чисел не произойдет. Есть идеи?
Еще одна вещь: в данный момент я не забочусь о сортировке, так как об этом позаботятся разные.
Я добавляю весь код для лучшей наглядности команды 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 и ниже Различного вызова.
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;
}