检查字符串列表是否包含字符串的确切部分

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);

iteminputSplittedstring 的数组,所以调用它们的 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);

这假设我正确理解了您的问题,并且输入顺序等无关紧要。你只是想知道用户写的每个数字是否在列表中的某个地方。