2013-06-24 4 views
17

タプルのリストから重複を見つけて削除する必要があります。 は基本的に、私の構造は、そのように構成されていますCでタプルのリストで重複を見つけて削除する#

List<Tuple<string, string>> myList = new List<Tuple<string, string>>(); 

**** 

private void FillStructure() 
{ 
    myList.Add(Tuple.Create<string, string>("A", "B")); 
    myList.Add(Tuple.Create<string, string>("A", "C")); 
    myList.Add(Tuple.Create<string, string>("C", "B")); 
    myList.Add(Tuple.Create<string, string>("C", "B")); // Duplicate 
    myList.Add(Tuple.Create<string, string>("A", "D")); 

    FindAndRemoveDuplicates(myList); 
} 

private void FindAndRemoveDuplicates(List<Tuple<string, string>> myList) 
{ 
     // how can I perform this ? 
} 

私は同じキーが異なる値を持つことができますので、私は辞書を使用することはできません!これはかなりの場所で重複を削除するよりも、リストを再作成することを

myList = myList.Distinct().ToList(); 

注: は、あなたがこのようなLINQのDistinct()方法を、使用することができ、事前

答えて

19

でいただきありがとうございます。

+0

を使用する:あなたはそれを再び表示するに変換できる要素を追加して行われた後!ありがとうございました! :) – davideberdin

0

distinct()方法用途:

myList.Distinct().ToList(); 
0

あなたの場所にリストを修正するソリューションをしたい場合は、HashSet<T>を利用する(または古いフレームワークのDictionary<Tuple<string, string>, object>と値を無視する)ことができます。

var existing = new HashSet<Tuple<string, string>>(); 

for (int i = myList.Count - 1; i >= 0; i--) 
{ 
    if (existing.Contains(myList[i])) 
    { 
     myList.RemoveAt(i); 
    } 
    else 
    { 
     existing.Add(myList[i]); 
    } 
} 

イテレータを使用せずに逆算します(そうしないと、反復中にリストを修正する際にエラーが発生します)。

HashSet<T>には、必要な場合にオーバーライドのためのオーバーロードがあります。

個人的には、可読みのためdasblinkenlight's answerに行っています。

6

あなたは(例として、casesensetiveない)あなたがあなた自身の比較演算を書くのであれば、あなたは少し違った文字列を比較することができ、この目的のために(http://msdn.microsoft.com/en-us/library/bb359438.aspx

class SameTuplesComparer<T1, T2> : EqualityComparer<Tuple<T1, T2>> 
{ 
    public override bool Equals(Tuple<T1, T2> t1, Tuple<T1, T2> t2) 
    { 
     return t1.Item1.Equals(t2.Item1) && t1.Item2.Equals(t2.Item2) 
    } 


    public override int GetHashCode(Tuple<T1, T2> t) 
    { 
    return base.GetHashCode(); 
    } 
} 

をHashSetのを使用することができます。

class SameStringTuplesComparer: EqualityComparer<Tuple<string, string>> 
{ 
    public override bool Equals(Tuple<string, string> t1, Tuple<string, string> t2) 
    { 
     return t1.Item1.Equals(t2.Item1, StringComparison.CurrentCultureIgnoreCase) && t1.Item2.Equals(t2.Item2, StringComparison.CurrentCultureIgnoreCase) 
    } 


    public override int GetHashCode(Tuple<string, string> t) 
    { 
    return base.GetHashCode(); 
    } 
} 

コード内:

var hashSet = new HashSet<Tuple<string, string>>(list, new SameTuplesComparer()); 

または独自の比較なしr:

var hashSet = HashSet<Tuple<string, string>>(list); 

ここで要素をhashSetに追加すると、すべての要素が一意になります。

var uniquedList = hashSet.ToList(); 

それとも解決策はとても簡単だったlist.Distinct().ToList()

+0

この例では 'List 'ではなく、 'HashSet 'で終わることに注意してください。また、 'Tuple <文字列、文字列>'は、比較関数を供給する必要はありません。 –

+0

回答が編集されました。ありがとうございました –

+0

+1 –

関連する問題