2010-02-14 31 views
8

我試圖從文字的數組使用下面的代碼獲取單詞的不同列表:選擇從Array詞的鮮明名單與LINQ

string words = "this is a this b"; 

var split = words.Split(' '); 

IEnumerable<Word> distinctWords = (from w in split 
          select new Word 
            { 
             Text = w.ToString() 
            } 
         ).Distinct().ToList(); 

我認爲這將取出的雙重發生'this',但它會返回每個單詞的列表。

有人可以請建議我怎麼能得到一個清晰的名單?由於

戴夫

+0

不應該二號線是'字符串[] =拆分單詞。斯普利特()'? –

+0

D'Oh! - @馬克,你是對的。我想我的複製/粘貼有點sl - - 我現在已經修好了。雖然我在那個階段有一兩個眼鏡! :-) – DaveDev

回答

19

在你的榜樣,每一個Word對象不同,因爲沒有比較,看起來在Text屬性。

但是,沒有理由來創建一個新的對象:

var distinctWords = (from w in split 
         select w).Distinct().ToList(); 

或者更簡單地說:

var distinctWords = new List<string>(split.Distinct()); 
1

您還沒有發佈的代碼爲您Word類,但我的猜測是,它不與值比較實現Equals讓您得到的Equals默認實現剛剛檢查對象引用。請注意,如果您決定實施自己的版本Equals,則還需要正確實施GetHashCode

解決此問題的另一種方法是提供IEqualityComparer作爲Distinct函數的參數。

1

問題是,您創建了幾個包含相同值的Word對象,但編譯器應該如何知道這些應該是相同的項目?

嘗試

(from w in split.Distinct() 
select new Word { Text = w.ToString()}).ToList(); 
0

正如其他人所指出的,這個問題可能是你的Word對象不實現結構平等(比較實際內容,而不是實例參考)。如果您仍然希望得到Word對象作爲結果的集合,但在基礎字符串值使用Distinct,你可以這樣寫:

IEnumerable<Word> distinctWords = 
    (from w in split.Distinct() 
    select new Word { Text = w.ToString() }).ToList();