2011-11-26 17 views
1

我有一個List<X>其中X有幾個領域:列表<T> - 區別的T.field

public string word; 
public int count; 

我如何得到一個List<X>具有鮮明X.word元素?

+0

我不知道它對您使用列表以及性能是否是一個問題有多重要。如果SortedList可以,你可以爲X定義一個比較運算符,這個運算符對字符串使用字典式的排序(X Thomas

回答

7

您可以使用分組

var n = from n in items 
    group n by n.word into g 
    select g.First(); 
2

MoreLinqDistinctBy方法:

var distinctByWord = list.DistinctBy(x => x.Word).ToList(); 
1

你需要使用Distinct方法,它的IEqualityComparer<X>實例的過載:

new List<X>().Distinct(new XComparer()); 

public class XComparer : IEqualityComparer<X> { 
    public bool Equals(X x, X y) { 
     return x.word.Equals(y.word); 
    } 

    public int GetHashCode(X obj) { 
     return obj.word.GetHashCode(); 
    } 
} 

public class X { 
    public string Word { get; set; } 
    public int Count { get; set; } 
} 

然後:

var myList = new List<X>() { 
    new X(){ Count = 1, Word = "A" }, 
    new X(){ Count = 2, Word = "A"}, 
    new X(){ Count = 1, Word = "B"} 
}; 

foreach(var x in myList.Distinct(new XComparer())) 
    Console.WriteLine(x.Count + " " + x.Word); 

打印:

1 A 
1 B 
+1

這個返回一個列表'',而不是一個'清單' –

+2

現在更好;) –

+0

@ThomasLevesque - 謝謝你讓我說實話:) –

2

從你的數據結構,我建議你可能要一個解釋,而不是一個列表。

如果您正在計算查看某個單詞的次數,或者通過添加計數結合其他輸入的(單詞,計數)對,可以更有效地使用Dictionary來執行此操作,因爲您不必掃描列表以找到要更新的條目。

+0

+1指出了這一點,然而,一個更完整的答案本來還包括如果字典不是他想要的,該怎麼辦。 –

0

我認爲這個想法是計數的話,而不是失去同名單詞的計數,對吧?如果是這樣,它會提醒我使用map-reduce算法。你已經完成了地圖,所以你需要以某種方式減少。我建議你創建新的Dictionary<string,int>並循環你的列表。如果字典沒有單詞 - 添加它(關鍵字,計數值),如果有 - 將計數添加到值。