【问题标题】:Find only equal words in list exist in string仅查找列表中相同的单词存在于字符串中
【发布时间】:2017-01-23 15:54:48
【问题描述】:

我有几个列表,字数在2000-3000字左右:

var list1 = new List<string> {"able", "adorable", "adventurous", ...};

如果字符串inputStr = "do, dream"; 包含列表中的任何值,我想用if (list1.Any(word.Contains))string[] words = inputStr.Split(' '); foreach (string word in words) 中查找字符串中的每个单词。

我不确定,可能是因为我使用了列表,或者我的搜索Contains方法对于这种情况不正确,但结果我发现了单词,它不等于输入字符串中存在的单词,但是其中包含此单词作为单词的一部分,例如单词“do”或单词“dream”:

(do)      adorable, doubt, fully, do, doh, freedom, down, double
(dream)   dreamily, dream 

不确定如何避免这种情况,如果问题是列表,最好使用DictionarySortedDictionary。如果我以这种方式检查,我会得到相同的结果var val1 = list1.FirstOrDefault(stringToCheck =&gt; stringToCheck.Contains(word)); 似乎不同的搜索给了我与列表相同的结果,所有单词都包含在输入字符串中找到的单词作为单词的一部分,但期望的结果是只找到相等的单词:

(do)      do
(dream)   dream 

【问题讨论】:

  • 好像你想做list1.Contains(word)
  • 你的最终目标是什么?您想在 list1 中的文本中查找单词?
  • 听起来你可以通过将输入设为列表然后获取list1.Intersect(list2)
  • @juharr 你好,如果我写(list1.Contains(word))而不是(list1.Any(word.Contains)),我已经回答了下面的结果,不确定原因
  • @Sergey Berezovskiy 你好,没错。我认为 tonythewest 的答案对我的特殊情况很有用

标签: c# string list


【解决方案1】:

要查找包含您的“单词”的序列,您应该使用Linq

// (do)      adorable, doubt, fully, do, doh, freedom, down, double
var result = list1.Select(word => word.Contains("do"));

但是如果你想得到完全匹配的词:

var result = list1.Select(word => word.Equals("do"));

将此与您的输入列表结合起来:

var result = input.SelectMany(x => list1.Where(w => w.Equals(x)));

编辑:

Here you can check it online

【讨论】:

  • 您好,是的,这对于 var input = new string[] { "do", "doh", "no" }; 这样的输入很有用就我而言,我只使用字符串
【解决方案2】:

IndexOf() 方法将为您获取集合中任何等效字符串的索引。

你也可以用 LINQ 做这样的事情:

list.Any(x => x == "testString");

【讨论】:

  • 您好,我发现这种方式对我的情况最有用,所以我将其标记为答案,但如果输入为 var input = new string[] { "text" }; m.rogalski 答案很有用
【解决方案3】:

你可以用一条 Linq 行来完成它:

List<string> list1 = new List<string> { "able", "adorable", "adventurous" };
string inputstr = "the adorable adventurous cat";
var found_words = inputstr.Split(' ').Where(word => list1.Contains(word));
// found_words[0] = "adorable"
// found_words[1] = "adventurous"

【讨论】:

  • @nikorio IEnumerable 集合不实现索引。您可以简单地在代码末尾添加 .ToArray() 或 .ToList() 将 'found_words' 转换为 string[] 或 List 类型,这两者都可以处理索引。
【解决方案4】:
if (list1.Contains(word))

只会匹配列表中的完整字符串。

但在这种情况下,您应该将 list1 改为 HashSet,这样性能会更好。

【讨论】:

  • 你好,我也试过这种方式,我不知道为什么,但是这种方式 (list1.Contains(word)) 而不是 (list1.Any(word.Contains)) 结果也是特定的,没有更多的单词包含字符串单词作为单词的一部分,它找到等于,但也找到绝对不存在的单词。例如,如果列表不包含任何其他单词的单词,并且我的输入字符串是“android”,但它表示列表包含单词“android”。我不想从列表中提取单词,只想知道是否包含
【解决方案5】:

Linq 仍然是您的最佳选择。假设您想要区分大小写但不想观察悬挂空白:

public string Foo(string input, List<string> list)
{
    return (list.FirstOrDefault(t.Trim() == input.Trim())); 
}

我个人更喜欢按值比较strings,而不是大多数时间使用Equals,但对于字符串比较,您可能需要根据需要缩小Culture

【讨论】:

  • 你好,它看起来对不同的情况很有用,但我不太了解我的特殊情况的优势?
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2018-06-02
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
相关资源
最近更新 更多