繁体   English   中英

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

[英]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”

有没有办法比较字符串列表中的任何项目是否与输入完全匹配。 在上述情况下,它应该返回一个 false。 但是,如果我的输入是“31”,它应该给出真值,或者如果我的输入是“7、31”,它也应该给出真值。

我尝试了这段代码,但它总是返回 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);

iteminputSplitted是 arrays 的string ,所以对它们调用的Any只是检查那些 arrays 是否不为空(即它们中是否有任何字符串),对于提供的示例,它总是评估为true

如果我正确理解规则 - 输入应该作为完整字符串出现在原始集合中或作为逗号原始集合拆分的一部分 - 你应该比较 collections 中的字符串。快速修复将使用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 有一个很好的答案。 一个简单易读的问题解决方案是获取用户输入,将其拆分(并修剪),并对要检查的字符串列表执行相同的操作,然后执行类似

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

或者使用方法组: inputSplitted.All(plates.Contains);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM