检查字符串列表是否包含字符串的确切部分
Check if list of string contains exact part of string
我有一个字符串列表如下,
List<string> str = new List<string>() { "7, 31", "2, 4", "5, 6" };
我的输入类似于“1、2”或“1”
有没有办法比较字符串列表中的任何项目是否与输入完全匹配。在上述情况下,它应该 return 为假。但是,如果我的输入是“31”,它应该给出 true,或者如果我的输入是“7, 31”,它也应该给出 true。
我尝试了这段代码,但它总是 return 正确。请帮忙
bool res = false;
List<string> substrings = new List<string>() { "7, 31", "2, 4", "5, 6" };
string input = "1"; //Because my input can be "1" or "1, 31" etc spltting it.
var inputSplitted = input.Split(',');
var plates = substrings.Select(x => x.Split(','));
foreach (var item in plates)
{
if (item.Any() == inputSplitted.Any())
{
res = true;
}
}
Console.WriteLine(res);
item
和 inputSplitted
是 string
的数组,所以调用它们的 Any
只是检查这些数组是否不为空(即是否有任何字符串在它们中)对于提供的示例,它始终会评估为 true
。
如果我对规则的理解正确——输入应该在原始集合中作为完整字符串存在,或者作为按逗号分隔的原始集合的一部分——你应该比较集合中的字符串。快速修复将使用 SequenceEqual
对一个元素输入进行额外处理(似乎您还需要对两个拆分结果调用 .Select(s => s.Trim()).ToArray()
):
if (item.SequenceEqual(inputSplitted)
|| (inputSplitted.Length == 1 && item.Contains(inputSplitted.First())))
{
res = true;
}
但一般情况下,如果多次执行此类搜索,将导致性能不佳。我建议使用 HashSet
进行此类搜索:
var hash = substrings
.SelectMany(s => s.Split(",").Select(s => s.Trim())) // flatten split strings
.Concat(substrings) // and concatenate with original
.ToHashSet();
var res = hash.Contains(input); // search in collection (should be prepared one time)
如果项目的顺序不重要(即“7, 31”和“31, 7”相同),您可以通过拆分并在拆分结果上使用 OrderBy(s => s)
来重建搜索和输入字符串在连接回来之前。
Guru Stron 给出了很好的答案。
一个简单易读的问题解决方案是获取用户输入,将其拆分(和 trim 它),并对要检查的字符串列表执行相同的操作,然后执行类似
inputSplitted.All(s => plates.Contains(s));
或方法组:inputSplitted.All(plates.Contains);
这假设我正确理解了您的问题,并且输入顺序等无关紧要。你只是想知道用户写的每个数字是否在列表中的某个地方。
我有一个字符串列表如下,
List<string> str = new List<string>() { "7, 31", "2, 4", "5, 6" };
我的输入类似于“1、2”或“1”
有没有办法比较字符串列表中的任何项目是否与输入完全匹配。在上述情况下,它应该 return 为假。但是,如果我的输入是“31”,它应该给出 true,或者如果我的输入是“7, 31”,它也应该给出 true。
我尝试了这段代码,但它总是 return 正确。请帮忙
bool res = false;
List<string> substrings = new List<string>() { "7, 31", "2, 4", "5, 6" };
string input = "1"; //Because my input can be "1" or "1, 31" etc spltting it.
var inputSplitted = input.Split(',');
var plates = substrings.Select(x => x.Split(','));
foreach (var item in plates)
{
if (item.Any() == inputSplitted.Any())
{
res = true;
}
}
Console.WriteLine(res);
item
和 inputSplitted
是 string
的数组,所以调用它们的 Any
只是检查这些数组是否不为空(即是否有任何字符串在它们中)对于提供的示例,它始终会评估为 true
。
如果我对规则的理解正确——输入应该在原始集合中作为完整字符串存在,或者作为按逗号分隔的原始集合的一部分——你应该比较集合中的字符串。快速修复将使用 SequenceEqual
对一个元素输入进行额外处理(似乎您还需要对两个拆分结果调用 .Select(s => s.Trim()).ToArray()
):
if (item.SequenceEqual(inputSplitted)
|| (inputSplitted.Length == 1 && item.Contains(inputSplitted.First())))
{
res = true;
}
但一般情况下,如果多次执行此类搜索,将导致性能不佳。我建议使用 HashSet
进行此类搜索:
var hash = substrings
.SelectMany(s => s.Split(",").Select(s => s.Trim())) // flatten split strings
.Concat(substrings) // and concatenate with original
.ToHashSet();
var res = hash.Contains(input); // search in collection (should be prepared one time)
如果项目的顺序不重要(即“7, 31”和“31, 7”相同),您可以通过拆分并在拆分结果上使用 OrderBy(s => s)
来重建搜索和输入字符串在连接回来之前。
Guru Stron 给出了很好的答案。 一个简单易读的问题解决方案是获取用户输入,将其拆分(和 trim 它),并对要检查的字符串列表执行相同的操作,然后执行类似
inputSplitted.All(s => plates.Contains(s));
或方法组:inputSplitted.All(plates.Contains);
这假设我正确理解了您的问题,并且输入顺序等无关紧要。你只是想知道用户写的每个数字是否在列表中的某个地方。