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

ca1c2owp  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(157)

我有一个字符串列表如下,

List<string> str = new List<string>() { "7, 31", "2, 4", "5, 6" };

字符串
我的输入将是“1,2”或“1”
有没有一种方法可以比较字符串列表中的任何项是否与输入完全匹配。在上面的情况下,它应该返回false。但是如果我的输入是“31”,它应该给予我一个true,或者如果我的输入是“7,31”,它也应该给true。
我尝试了这段代码,但它总是返回true。

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

q9rjltbz

q9rjltbz1#

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)重新构建搜索和输入字符串,然后再连接回来。

mtb9vblg

mtb9vblg2#

Guru Stron有一个很好的答案。一个简单的,可读的解决方案是获取用户输入,分割(并修剪),并对要检查的字符串列表进行相同的操作,然后做一些类似的事情。

inputSplitted.All(s => plates.Contains(s));

字符串
或者使用方法组:inputSplitted.All(plates.Contains);
这里假设我正确理解了你的问题,输入顺序等并不重要,你只想知道用户输入的每个数字是否在列表中的某个地方。

相关问题