使用 Linq 比较两个列表中的字符串

3

我需要比较两个字符串列表,并找出相似的元素。例如:

List<string> listA = {"ProfileHeight", "ProfileWidth", "WebThickness"}
List<string> listB ={"ProfileHeightVisibility", "ProfileWidthVisibility", "WebThicknessVisibility", "FlangeThicknessVisibility", "DepthVisibility"}

我想知道是否可以使用Linq。我希望结果是一个列表,其中包含ListB中名称与ListA中字符串相似的元素。其中语句“ProfileHeightVisibility.Contains(“ProfileHeight”)= true”。


你所说的“类似”,是指“以...开头”还是“包含...”? - Corak
5个回答

20
你的意思是你想得到listB中包含listA中任意元素的项?
listB.Where(b => listA.Any(a => b.Contains(a))

5

您可以使用LINQ来实现:

listB.Where(e => listA.Any(a => e.Contains(a)));

请记住,这个算法的运行时间成本类似于O(n^2),因此随着列表中元素数量的增加,它会很快变慢。


1
您也可以实现类似这样的东西:

,其中包含HTML代码。
  public class EqualityComparer : IEqualityComparer<string>
  {

    public bool Equals(string x, string y)
    {
      return y.Contains(x);
    }

    public int GetHashCode(string obj)
    {
      return 1;
    }
   }

然后像这样使用交集:

 listB.Intersect(listA, new EqualityComparer()).ToList();

0
List<string> listA = new List<string> { "zinmin", "zin1", "zin2" };
List<string> listB = new List<string> { "zinmin", "min1", "min2" };



List<string> matching = listA.Intersect(listB).ToList();

匹配结果将会是{"zinmin"}。排序顺序无关紧要。


0

是的,您可以使用LINQ来实现这样的功能。

    public List<string> GetSimilarStrings(List<string> list1, List<string> list2)
    {
        return (from item in list1 from item2 in list2 where string.Equals(item,item2,StringComparison.InvariantCultureIgnoreCase) select item).ToList();
    }

为什么要使用 string.Compare?这个方法返回一个整数,表示两个字符串的词法顺序,而不是布尔值,是吗? - Matthias Meid
是的,说得好。我已经更正了我的答案。通过“==”比较字符串可能会导致文化、编码或单词大小写敏感性方面的问题。这个例子展示了如何处理这些问题。 - toszo
我不确定这些字符串是否应该是相等的。然而,我可能更愿意使用string.Equals(a, b, StringComparision.InvariantCultureIgnoreCase) http://msdn.microsoft.com/en-us/library/t4411bks.aspx - Matthias Meid
你说得对,使用String.Equals可能会更好。 - toszo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接