我有一个对象列表。该对象包含一个字符串List。像那样:

public class ObjectA
{
    ...
    IList<string> StringList;
}


我有一个要在StringList上搜索的单词列表。我需要在ObjectA列表上进行搜索,并找到具有所有单词(所有单词的一部分)的所有ObjectA。

所以我做到了:

 List<ObjectA> myObjectList;
 List<string> wordsToFind;

 var result = myObjectList.Where(objectA => wordsToFind.All(objectA.StringList.Contains));


问题是我的结果是只得到整个单词(等于)。我想得到包含我的wordsToFind部分内容的结果。



wordsToFind = {"tes","don"};
StringListElement = {"test", "done"}


应该返回我的选择。

我怎样才能做到这一点?

最佳答案

IndexOf可能是您想去的地方,或其重载之一


  报告指定项首次出现的从零开始的索引
  此实例中的Unicode字符或字符串。方法返回
  如果在此实例中找不到字符或字符串,则为-1。


List<ObjectA> myObjectList;
List<string> wordsToFind;

var result = myObjectList.Where(x => x.StringList.All(y => wordsToFind.Any(z => y.IndexOf(z) >= 0)));


另请注意,此操作的时间复杂度非常糟糕



更新资料

Full Demo Here

另请注意,如果要不区分大小写使用

y.IndexOf(z, StringComparison.InvariantCultureIgnoreCase)


或以下之一


CurrentCulture使用对区域性敏感的排序规则和当前区域性来比较字符串。
CurrentCultureIgnoreCase使用对区域性敏感的排序规则,当前区域性来比较字符串,而忽略要比较的字符串的大小写。
InvariantCulture使用区分区域性的排序规则和不变区域性比较字符串。
InvariantCultureIgnoreCase使用区分区域性的排序规则(不变区域性)比较字符串,而忽略要比较的字符串的大小写。
Ordinal使用序数(二进制)排序规则比较字符串。
OrdinalIgnoreCase使用顺序(二进制)排序规则比较字符串,而忽略要比较的字符串的大小写。

10-06 13:26
查看更多