【问题标题】:Do any items in List<string> contain part of a separate stringList<string> 中的任何项目是否包含单独字符串的一部分
【发布时间】:2017-09-28 22:46:11
【问题描述】:

假设我有List&lt;string&gt;,看起来像这样:

  • 苹果
  • 桃子
  • 李子

然后在一个字符串中,如果我有:

I would like to eat a pear today

(忽略大小写。)在这种情况下,我想要true,因为pear在列表和字符串中都可以找到。但如果我有一个字符串:

I would like to eat a strawberry today

然后我会得到false,因为在句子中找不到任何List&lt;string&gt;'s

我一直在玩各种各样的事情,例如:

string result = Fruits.FirstOrDefault(s => s.IndexOf(sentence) > 0);

其中FruitsList&lt;string&gt;sentence 是另一个字符串。没搞定。

【问题讨论】:

  • 所以,如果你想要true\false作为结果,你可以像string result = Fruits.Any(s =&gt; s.IndexOf(sentence) &gt; 0);一样使用它
  • 布尔结果 = ....?我会试一试。
  • 我总是得到'假' :-(
  • 你需要这样检查=> string result = Fruits.Any(s =&gt; sentence.IndexOf(s) &gt; -1);
  • 如果不清楚,问题在于您检查的是单词是否包含句子,而不是句子是否包含单词。

标签: c# .net string linq


【解决方案1】:

试试这个:

bool result = Fruits.Any(s => sentence.ToLower().Contains(s.ToLower()));

bool result = Fruits.Any(s => sentence.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) >= 0);

【讨论】:

  • 嗯,我认为这看起来不错,但我得到了,“字符串不包含“包含”的定义“
【解决方案2】:

你需要这样检查=>

string result = Fruits.Any(s =&gt; sentence.IndexOf(s) &gt; -1);

string result = Fruits.Any(s =&gt; sentence.Contains(s));

【讨论】:

  • Any 返回 bool 而不是 string
  • @Aominè OP 想从问题 I would want trueThen I would get false 得到 bool 理解
【解决方案3】:

如果您愿意接受另一种方法,可以使用以下方法:

public static bool ListItemInString(List<string> listOfStrings, string stringToCheck) {
    foreach(string str in listOfStrings) {
        if (stringToCheck.ToUpper().Contains(str.ToUpper())) {
            // return true if any of the list items are found in stringToCheck
            return true;
        }
    }
    // if the method has not returned true by this point then we return false
    // to indicate none of the list items were found within the string
    return false;
}

此方法循环遍历您的列表并根据您指定的字符串检查每个项目。如果在 foreach 循环中的任何一点发现您的列表项之一包含在字符串中,它将返回尝试,否则将返回 false。它还通过在对字符串执行搜索之前将两个字符串都转换为大写来考虑您的不区分大小写的请求。

编辑:我知道这更像是一种手动方法。如果这是多次执行的操作,则可以将本文前面的答案类似地转化为提高代码可读性的方法。

【讨论】:

  • 您可以使用string.Compare重载将ignoreCase参数指定为true或将此设置移动到函数参数。但是为什么你认为将 1 行代码更改为 5 行并将这 5 行封装成新函数会提高可读性? string result = Fruits.Any(s =&gt; sentence.Contains(s)); 这里有什么不能理解的,你想用 cmets 来实现它?
【解决方案4】:

根据最初的问题,如果您正在句子中寻找匹配的字符串而不是布尔结果,那么下面的代码应该会有所帮助:

List<string> Fruits = new List<string> { "Apple", "Pear", "Peach", "Plum" };
var sentence = "I would like to eat a pear and apple today";
var sentenceLower = sentence.ToLower(); 
var delimiter = ",";
var match = Fruits
  .Where(s => sentenceLower.Contains(s.ToLower()))
  .Aggregate((i, j) => i + delimiter + j);

【讨论】:

  • 在linq查询之前准备sentence.ToLower(),每次都不计算,会更好。或者使用string.Compare重载并将ignoreCase参数指定为true没有太大影响,就像建议
猜你喜欢
  • 2013-03-14
  • 2011-12-07
  • 2011-09-19
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2016-09-16
  • 2017-03-28
相关资源
最近更新 更多