如何使用Linq检查完全匹配?

时间:2013-11-19 12:15:28

标签: c# linq

var result = (from a in reference.AsEnumerable()
      from b in input.AsEnumerable()
      where a.Field<string>("Synonym(System name)") != null && b.Field<string>("SystemName") != null && a.Field<string>("Synonym(System name)").Contains(b.Field<string>("SystemName"))
      select  a.Field<string>("Standard Name")).Distinct();

        if (result.Any())
        {
      //this returns 
        }

在SystemName中,我有像Image

这样的值

Synonym(System name)包含Image,Picture,ImgEditor

之类的值

所以它有效并且一切都很好

但我的问题就像是

Synonym(System name)包含Pic,Picture,Image Editor

之类的值

这也返回true。但是它应该返回false。因为Image不在Pic,Picture,Image Editor

1 个答案:

答案 0 :(得分:2)

Image不是Image Editor,但Pic,Picture,Image Editor 包含 Image。所以尝试改变

a.Field<string>("Synonym(System name)").Contains(b.Field<string>("SystemName"))

使用

a.Field<string>("Synonym(System name)").Split(',').Any( s => s == b.Field<string>("SystemName"))

为什么这样做?

您的原始逻辑只有一个字符串Pic,Picture,Image Editor,并且您尝试检查其中是否存在Image,如果您将其视为字符串,则肯定会这样做。就像c,Pic是字符串的一部分一样。 String.Contains没有列表的概念,因为你在字符串中使用了逗号作为分隔符。

因此,通过在逗号上拆分,使用string.Split(',')将字符串拆分为字符串数组。 split的结果是一个数组,其中包含以下值作为单独的字符串["Pic","Picture","Image Editor"]。我们在此使用LINQ方法Any来识别此列表中的任何条目是否等于字符串"Image",并且由于它们都不是,因此它将返回false。