检查字符串是否以c#中的任意顺序出现在列表中

本文关键字:顺序 列表 任意 字符串 是否 检查 | 更新日期: 2023-09-27 18:03:30

如果我们有如下代码所示的字符串列表:

        List<string> XAll = new List<string>();
        XAll.Add("#10#20");
        XAll.Add("#20#30#40");
        string S = "#30#20";//<- this is same as #20#30 also same as "#20#30#40" means S is exist in that list
        //check un-ordered string S=  #30#20
        // if it is contained at any order like #30#20 or even #20#30  ..... then return true :it is exist
        if (XAll.Contains(S))
        {
            Console.WriteLine("Your String is exist");
        }

我更愿意使用Linq来检查S在这方面是否存在,无论列表中的顺序如何,但它包含(#30)和(#20)[至少]在该列表XAll中。

我使用

var c = item2.Intersect(item1);
                if (c.Count() == item1.Length)
                {
                    return true;
                }

检查字符串是否以c#中的任意顺序出现在列表中

您应该以更有意义的方式表示您的数据。不要依赖字符串。

例如,我建议创建一个类型来表示这些数字的集合,并编写一些代码来填充它。

但是已经有集合类型,比如HashSet,它可能很好地匹配用于测试子集的内置函数。

这应该让你开始:

var input = "#20#30#40";
var hashSetOfNumbers = new HashSet<int>(input
       .Split(new []{'#'}, StringSplitOptions.RemoveEmptyEntries)
       .Select(s=>int.Parse(s)));

这个适合我:

    Func<string, string[]> split =
        x => x.Split(new [] { '#' }, StringSplitOptions.RemoveEmptyEntries);
    if (XAll.Any(x => split(x).Intersect(split(S)).Count() == split(S).Count()))
    {
        Console.WriteLine("Your String is exist");
    }

现在,取决于你想要处理重复,这甚至可能是一个更好的解决方案:

    Func<string, HashSet<string>> split =
        x => new HashSet<string>(x.Split(
                    new [] { '#' },
                    StringSplitOptions.RemoveEmptyEntries));
    if (XAll.Any(x => split(S).IsSubsetOf(split(x))))
    {
        Console.WriteLine("Your String is exist");
    }

第二种方法使用纯集合论,因此它剥离了重复项。