2017-04-03 121 views
0

我有一个字符串和一个字符串的列表,我希望如果字符串包含列表中存在的任何字符串系统返回false。我使用下面的lambda表达式:Linq查询检查列表和字符串之间的子字符串

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper() == lo_operandVal.ToString().ToUpper()); 

以下是数据集:

lo_operandVal = “ABC DEF GHI邮政信箱” ro_operandVal是一个字符串与下列元素列表:

  1. 邮政信箱
  2. PO BOX

当我评估这个表达式时,它总是返回true。

+1

你说你想找到如果字符串*包含列表中*任何字符串目前,但是你使用* equals *进行比较。鉴于你的字符串不等于它们中的任何一个,看起来并不太令人吃惊,你没有找到匹配。 –

回答

2

你可以试试下面的LINQ - 如果在字符串中发现在列表中的任何值,那么它将返回false,如果没有他们,然后发现它会返回true

var result = ro_operandVal.All(c=>lo_operandVal.IndexOf(c) < 0); 

更新

都是对象类型,你知道它们的确切类型,他们是List<string>string您可以键入扮演他们。

var result = ((List<string>)ro_operandVal).All(c=>lo_operandVal.ToString().IndexOf(c) < 0); 
+0

我更喜欢这种方法。您可能想要使用带有StringComparison的'IndexOf'重载,以便您可以忽略大小写(根据问题中的代码)。 –

+0

ro_operand和lo_operand是对象类型 –

+0

你永远不能在你的问题中提到这一点。顺便说一句,当你知道确切的类型,他们是'列表',另一个是'字符串'你可以键入他们 –

0

使用.Contains()来查看文本是否包含在列表中,而不是试图使用equals运算符完全匹配字符串。

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper().Contains(lo_operandVal.ToString().ToUpper())); 
+0

感谢您的编辑:p –

+1

没有问题,您可以通过点击您的答案下的“编辑”来自己动手......而且您还可以删除旧评论,因此帖子看起来更干净... –

0

使用包含如下:

result = !(((string[])ro_operandVal).ToList<string>()).Any(x => x.ToString().ToUpper().Contains(lo_operandVal.ToString().ToUpper())); 
0

有几个代码问题您提供:

  1. 第一类铸件string[],然后转换为List<string>,他们两人都是IEnumerable<string>类型的,所以要么会工作,您不需要双重转换
  2. 使用==运算符而不是Contains,它完成字符串比较,并且任何差异将被视为不匹配
  3. 转换为ToUpper处理情况的差异,它应是StringComparison.OrdinalIgnoreCase,这将处理所有的情况下,差异

应按下述代码,其中包括string contains扩展方法,此代码将如果任何返回false,列表中的项目包含一个子串,从你的问题复制,按要求

result = !(ro_operandVal).ToList<string>().Any(x => x.Contains(lo_operandVal)); 

扩展方法

public static class StringExtensions 
{ 
    public static bool Contains(this string source, string subString) 
    { 
    return source?.IndexOf(subString, StringComparison.OrdinalIgnoreCase) >= 0; 
    } 
} 
修改
0

下面的代码段完全为我工作

result = !(((string[])ro_operandVal).ToList<string>().Any(lo_operandVal.ToString().Contains)); 

忽视的情况:

result = !((((string[])ro_operandVal).ToList<string>().ConvertAll(d => d.ToUpper())).Any(lo_operandVal.ToString().ToUpper().Contains));