我有一个对象列表。该对象包含一个字符串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"}
应该返回我的选择。
我该怎么做?
答案 0 :(得分:4)
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)));
还请注意,此操作的时间复杂度很糟糕
更新
还请注意,如果您不区分大小写,请使用
y.IndexOf(z, StringComparison.InvariantCultureIgnoreCase)
或以下其中一项
CurrentCulture
使用对区域性敏感的排序规则和当前区域性来比较字符串。
CurrentCultureIgnoreCase
使用对区域性敏感的排序规则,当前区域性来比较字符串,而忽略要比较的字符串的大小写。
InvariantCulture
使用区分区域性的排序规则和不变区域性比较字符串。
InvariantCultureIgnoreCase
使用对区域性敏感的排序规则,不变区域性来比较字符串,而忽略要比较的字符串的大小写。
Ordinal
使用有序(二进制)排序规则比较字符串。
OrdinalIgnoreCase
使用序数(二进制)排序规则比较字符串,而忽略要比较的字符串的大小写。
答案 1 :(得分:0)
我认为这应该对您有用
var wordsToFind = new List<string>{ "tes","don"};
var data= new List<ObjectA>()
{
new ObjectA()
{
StringList = new List<string>{"test", "done", "blah"}
},
new ObjectA()
{
StringList = new List<string>{"test2", "done2", "blah2"}
}
};
var result = (from item in data.Select(x => x.StringList)
from bar in item
from word in wordsToFind
where bar.Contains(word)
select bar)
.ToList();
结果 应该给您
"test", "done","test2", "done2"
答案 2 :(得分:0)
做到这一点的方法是结合使用Any
和All
。
您需要检查wordsToFind
的 all 个元素是否是StringList
bool result = wordsToFind.All(word => currentObject.StringList.Any(str => str.Contains(word));
这是对象列表中的一个对象。您可以再次将All
应用于该列表。