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
。
答案 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。