2013-07-25 54 views
0

我有兩個列表,importedexisting。它們可以具有相同的長度或不同的長度。根據內容比較兩個不同長度的字符串列表,不是長度

我想檢查imported是否有任何不在existing的內容。

如果它們是相同的長度,我可以用下面對它們進行比較,找到一個不匹配:

if(Enumerable.SequenceEqual(imported.OrderBy(i => i), existing.OrderBy(ex => ex)) == false) 

如果列表的長度相同,預期上述作品。如果不是,它不包含其他不包含的項目,這是有道理的。

我該如何處理不同長度的列表?

場景A,應該通過,沒有什麼在imported,這不是在existing

現有:"One", "Two", "Three"

進口:"One","Two"

方案B,應該會失敗, 「二」在imported但它不在existing

現有:"One", "Two", "Three"

進口:"One","Tow"

我用IntersectExceptAny但他們將努力在方案A,而不是B,反之亦然。

+0

字符串比較(不區分大小寫)? – Steve

回答

5
imported.Except(existing).Any(); 
+0

不知道它是最好的方式(最好的方式=性能) –

+1

@HosseinNarimaniRad這是**很多**比任何'+'包含'更快。 –

+0

@HosseinNarimaniRad'Except'在內部使用HashSets,任何應該有這裏提出的解決方案的最佳性能。 (至少對於較大的收藏) – Magnus

0

如何通過填充null或string來使兩個列表的長度相同?將空缺位置填入空格?

1

這可能幫助:

imported.Any(i=>!existing.Contains(i)); 
+0

我很想知道誰降低了這個答案,爲什麼! –

1
if (imported.Any(item => !existing.Contains(item))) 
    ... 
3

Enumerable.Except可能是您的工具

List<string> imported = new List<string>() {"One", "Two", "Three"}; 
List<string> existing = new List<string>() {"One", "Two", "Four"}; 

List<string>missing = imported.Except(existing, 
         StringComparer.CurrentCultureIgnoreCase).ToList(); 
if(missing.Count == 0) 
    Console.WriteLine("Nothing to import"); 
else 
    Console.WriteLine("There are " + missing.Count + " items to import"); 

當然,這樣的回答假設你有事情做與得到的差異(如有) 。否則使用任何asnwers更直接給你的問題

+0

+1使用'StringComparer',但OP不想從導入排除'List',這就是爲什麼這個答案似乎比newStackExchangeInstance的答案冗長。 –

+0

是的,它看起來很長,但如果你看看核心,它只是一條線。正如我所說的,我認爲他需要得到的差異,因此需要轉換ToList和以下測試代碼。任何更簡單,但如果你只需要一個真正的/假的響應 – Steve