[英]Compare list<sting> with foreach loop ignoring case 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();
}
}
您可以將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?
嘗試這個:
foreach (string line in mylistA)
{
if (mylistB.Any(b => b.Equals(line, StringComparison.OrdinalIgnoreCase)))
{
ResultsToDocument();
}
}
為了獲得更好的性能和可讀性,您可以使用Intersect
foreach (var element in mylistA.Intersect(mylistB, StringComparer.OrdinalIgnoreCase))
ResultsToDocument();
如果mylistA
中有重復mylistA
需要保留。 使用哈希集進行查找將是正確的方法,並且具有與相交解決方案相同的性能。
var set = new HashSet<string>(mylistB, StringComparer.OrdinalIgnoreCase)
foreach (string line in mylistA)
{
if (set.Contains(line))
{
ResultsToDocument();
}
}
我會去:
foreach (string lineA in mylistA)
{
foreach (string lineB in mylistB)
{
if (lineB.ToUpper() == lineA.ToUpper())
{
ResultsToDocument();
}
}
}
但是可能有更好的解決方案可以達到相同的結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.