【发布时间】:2017-02-17 04:26:40
【问题描述】:
我想使用一组字符搜索字符串列表,并且想找到匹配项而不管顺序如何。例如,如果我的列表包含
List<string> testList = new List<string>() { "can", "rock", "bird" };
我希望能够使用“irb”进行搜索并让它返回bird。我必须这样做很多次,所以我正在寻找最有效的方法。
【问题讨论】:
我想使用一组字符搜索字符串列表,并且想找到匹配项而不管顺序如何。例如,如果我的列表包含
List<string> testList = new List<string>() { "can", "rock", "bird" };
我希望能够使用“irb”进行搜索并让它返回bird。我必须这样做很多次,所以我正在寻找最有效的方法。
【问题讨论】:
var query = "irb";
List<string> testList = new List<string>() { "can", "rock", "bird" };
var result = testList.Where(i => query.All(q => i.Contains(q)));
对testList中的每一项进行测试,看它是否包含query中的所有字母
【讨论】:
对于您的场景,您需要检查另一个单词列表中单词的每个字符。
为此,您可以这样做:
// Checks whether all character in word is present in another word
Func<string, string, bool> isContain = (s1, s2) =>
{
int matchingLength = 0;
foreach (var c2 in s2.ToCharArray())
{
foreach (var c1 in s1.ToCharArray())
{
if (c1 == c2)
++matchingLength;
}
}
// if matched length is equal to word length given, it would be assumed as matched
return s2.Length == matchingLength;
};
List<string> testList = new List<string>() { "can", "rock", "bird" };
string name = "irb";
var fileredList = testList.Where(x => isContain(x, name));
【讨论】:
如果您不关心匹配重复项而不是检查您正在搜索的序列中的所有字符是否都包含在单词中,那么对于谓词来说:
"irb".Except("bird").Count() == 0
整体情况:
List<string> testList = new List<string>() { "can", "rock", "bird" };
var search = "irb";
var matches = testList.Where(word => !search.Except(word).Any());
注意事项:
search.All(c => wordAsHashSet.Contains(c)) 作为条件。【讨论】:
你可以使用 linq 来实现这个
List<string> testList = new List<string>() { "can", "rock", "bird" };
var lst = testList.Where(x => x.ToUpperInvariant().Contains("IRD")).ToList();
确保您还使用ToUpper 比较案例,并且您要比较的string 也使用UpperCase
【讨论】:
or 或者单词也可以像rk 一样出现?