关于wpf:比较列表< sting>

Compare list<sting> with foreach loop ignoring case c#

我有一个应用程序可以比较用户输入的两个LST数据。但是,当前,如果两个值相同,但一个为大写,则应用程序将其类化为不匹配。

现在我已经使用过StringComparison.InvariantCultureIgnoreCase,但是我不确定如何在foreach循环中添加它。

我目前的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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作为参数:

1
2
3
4
5
6
7
foreach (string line in mylistA)
{
    if (mylistB.Contains(line, StringComparer.InvariantCultureIgnoreCase))
    {
        ResultsToDocument();
    }
}

更有效的方法是Intersect,它也有这种过载:

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


试试这个:

1
2
3
4
5
6
7
foreach (string line in mylistA)
{
    if (mylistB.Any(b => b.Equals(line, StringComparison.OrdinalIgnoreCase)))
    {
        ResultsToDocument();
    }
}


为了获得更好的性能和可读性,您可以使用Intersect

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

如果mylistA中有需要保存的副本。使用哈希集进行查找是正确的方法,并且与Intersect解决方案具有相同的性能。

1
2
3
4
5
6
7
8
var set = new HashSet<string>(mylistB, StringComparer.OrdinalIgnoreCase)
foreach (string line in mylistA)
{            
    if (set.Contains(line))
    {
         ResultsToDocument();
    }
}

我会跟着:

1
2
3
4
5
6
7
8
9
10
    foreach (string lineA in mylistA)
    {    
       foreach (string lineB in mylistB)
       {                    
            if (lineB.ToUpper() == lineA.ToUpper())
            {
                  ResultsToDocument();
            }
       }
    }

但可能有更好的解决方案来实现同样的结果