检查字符串是否以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;
}
您应该以更有意义的方式表示您的数据。不要依赖字符串。
例如,我建议创建一个类型来表示这些数字的集合,并编写一些代码来填充它。
但是已经有集合类型,比如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");
}
第二种方法使用纯集合论,因此它剥离了重复项。