2017-09-29 86 views
-1

我有一個應用程序可以比較兩個用戶輸入的數據lsts。但是,目前,如果兩個值相同,但是一個是大寫,則應用程序將這個值視爲不匹配。比較列表<sting>與foreach循環忽略情況c#

現在我已經使用StringComparison.InvariantCultureIgnoreCase之前,但我不確定如何將其添加到foreach循環內。

我現在的代碼如下;

List<string> mylistA = new List<string>(); 
List<string> mylistB = new List<string>(); 

if (listATextBox.LineCount > 0) 
    for (int i = 1; i <= listATextBox.LineCount; i++) 
     mylistA.Add(listATextBox.GetLineText(i - 1).Replace(Environment.NewLine, "").Trim()); 

if (listBTextBox.LineCount > 0) 
    for (int i = 1; i <= listBTextBox.LineCount; i++) 
     mylistB.Add(listBTextBox.GetLineText(i - 1).Replace(Environment.NewLine, "").Trim()); 

foreach (string line in mylistA) 
{    
    if (mylistB.Contains(line)) 
    { 
      ResultsToDocument(); 
    } 
} 
+0

https://stackoverflow.com/questions/444798/case-insensitive-containsstring –

+0

在編寫新的名單,只是ToUpper的值,如果你不約的情況下照顧。 – Skintkingle

+0

https://stackoverflow.com/questions/3107765/how-to-ignore-the-case-sensitivity-in-liststring –

回答

5

您可以使用Enumerable.Contains與此比較器作爲參數而不是List.Contains

foreach (string line in mylistA) 
{ 
    if (mylistB.Contains(line, StringComparer.InvariantCultureIgnoreCase)) 
    { 
     ResultsToDocument(); 
    } 
} 

更有效的方法是Intersect其中也有此重載:

foreach(string line in mylistA.Intersect(mylistB, StringComparer.InvariantCultureIgnoreCase)) 
    ResultsToDocument(); // does this make sense, not passing the line? 
+0

是的,這是有道理的,所以你不必通過線路和檢查完成在'foreach'中,你不需要if語句。 – MrMime

+0

使用'intersect'時必須注意的一件事是,如果'mylistA'中有重複項,它將不會在結果中生成重複項。就像問題中的循環一樣。 – Magnus

3

試試這個:

foreach (string line in mylistA) 
{ 
    if (mylistB.Any(b => b.Equals(line, StringComparison.OrdinalIgnoreCase))) 
    { 
     ResultsToDocument(); 
    } 
} 
-2

我會去用:

foreach (string lineA in mylistA) 
    {  
     foreach (string lineB in mylistB) 
     {      
      if (lineB.ToUpper() == lineA.ToUpper()) 
      { 
        ResultsToDocument(); 
      } 
     } 
    } 

但也有可能是更好的解決方案,以達到相同的結果

2

爲了獲得更好的性能和可讀性,您可以使用Intersect

foreach (var element in mylistA.Intersect(mylistB, StringComparer.OrdinalIgnoreCase)) 
    ResultsToDocument(); 

如果mylistA需要有重複被保存。使用哈希集進行查找將是正確的方式,並且與交叉解決方案具有相同的性能。

var set = new HashSet<string>(mylistB, StringComparer.OrdinalIgnoreCase) 
foreach (string line in mylistA) 
{    
    if (set.Contains(line)) 
    { 
     ResultsToDocument(); 
    } 
}