ここにいる誰かが、私が考えているよりも簡単に解決したと確信している問題があります。名前と番号のリストがあります。名前は必須で、重複する可能性があり、番号は 1 つのみですが、必須ではありません。
|name|number|
|A |2 |
|A | |
|B | |
|C | |
|C | |
|D |4 |
-------------
現時点では、名前の部分で list.Distinct() を実行していますが、番号の部分は気にしません。
newlist = oldlist.Distinct().ToList();
重複している名前の 1 つに番号がある場合、番号のある名前を保持したいのですが、これは起こっていません。2 つの同じ名前と 2 つの異なる番号のケースは発生しません。何か案は?
もう 1 つ: 現時点では、個別の処理が行われるため、並べ替えは気にしません。
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;
}