2013-02-02 33 views
1
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<string> aList = new List<string>(); 
     List<string> bList = new List<string>(); 
     List<string> answerList = new List<string>(); 
     aList.Add("and"); 
     aList.Add("and"); 
     aList.Add("AND"); 
     aList.Add("And"); 
     aList.Add("not"); 
     aList.Add("noT"); 
     bList.Add("NOt"); 
     answerList = aList.Except(bList, StringComparer.InvariantCultureIgnoreCase).ToList(); 

     foreach (var word in answerList) 
     { 
      Console.WriteLine(word); 
     } 
    } 

上述程序的預期行爲是刪除aList中所有「不」的事件並返回{和和AND,和}。看起來「StringComparer.InvariantCultureIgnoreCase」已經刪除了單詞「and」的所有重複項,並且在answerList中僅返回了一次{和}。linq的意外行爲除()方法

回答

1

the documentation of Except()(重點煤礦):

通過使用默認的相等比較值進行比較生成的差集兩個序列的

所以,Except()返回設置,這意味着它返回的每個字符串最多一次。而且,既然你告訴它應該忽略這種情況,你就會得到你得到的輸出。

要解決的是,使用不設置上操作的方法,如Where()

answerList = aList.Where(
    a => !blist.Contains(a, StringComparer.InvariantCultureIgnoreCase)) 
    .ToList(); 

這種方法是慢的(O(一個·b))當與Except()相比(O(a + b)),但這對短序列不應該是個問題。

+0

感謝您的詳細解釋。接受你的答案,因爲你已經完成了工作。 –

3

這是我直覺上預期的結果。

除了返回設置的差異,並且您明確指出要使用不區分大小寫的比較。

+0

謝謝您的回覆。你想告訴我們實際上我們得到的結果是意外的嗎?你知道爲什麼這樣嗎? –

+1

不,我在說的是Except是一個集合操作 - 它將輸入視爲一個集合。在一個集合中,每個值都包含或排除 - 不能有重複。 –

+0

謝謝:) .. –