Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带拆分的字符串列表_C#_Linq - Fatal编程技术网

C# 带拆分的字符串列表

C# 带拆分的字符串列表,c#,linq,C#,Linq,我有一个字符串和一个字符串列表。我试图返回一个列表,无论strList中包含什么,结果都应该是4和21 这是我的代码,不知道我遗漏了什么 string str= "21,1,4"; List<string> strList= new List<string> { "4","21" }; var a = str.Where(i => i.ToString().Split(new char[] { ',' },StringSplitOptions.RemoveEmpt

我有一个字符串和一个字符串列表。我试图返回一个列表,无论strList中包含什么,结果都应该是4和21

这是我的代码,不知道我遗漏了什么

string str= "21,1,4";
List<string> strList= new List<string> { "4","21" };

var a = str.Where(i => i.ToString().Split(new char[] { ',' },StringSplitOptions.RemoveEmptyEntries).ToList().Any(s=>strList.Contains(s)));
简单点。

你可以做到

string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };

List<string> splitList = str.Split(",").ToList();

List<string> overlap = strList.Where(str => splitList.Contains(str)).ToList();

其中commonStrings是您正在寻找的答案。

将所有内容保持在一条线上,这似乎是您的目标:

string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };

var a = str.Split(',').Where(s => strList.Contains(s));
a将是strList中包含的str拆分后的所有值的IEnumerable。

您可以使用Intersect

输出:

21,4


代码中的问题是,通过str.遍历字符串中的字符。您应该只拆分str,然后在strList中迭代以查找匹配项。

优雅的连接语法如何:

var results = (from main in str.Split(',')
                join key in strList
                on main equals key
                select main).ToList();

如果str有重复项,如果要删除重复项,可以添加.Distinct before.ToList。

对ToString i=>i.ToString的调用是冗余的……它已经是一个字符串了。一种很好的故障排除技术是将操作分解为多个部分。可以在单独的步骤中拆分字符串,这样当您单步执行调试器时,您可以更容易地看到所有的片段。@Tim调用.ToList在该数组上。split返回的数组对于.Any操作也是不必要的。@Tim。不,我是字符,因为str是字符串。所以这个调用不是多余的,只是在str中迭代字符在这里没有意义。@juharr-是的,你是对的。我没听清楚,但是考虑到Where.Where x=>strList.Contains x可以通过eta简化为strList.Contains的Where,这是有意义的-conversion@Sehnsucht我不知道我们能用那种格式写。谢谢分享
        var str = "21,1,4";
        var otherStrList = new List<string> { "4", "21" };
        var separatedstrList = str.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        var commonStrings = separatedstrList.Intersect(otherStrList);
string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };

var a = str.Split(',').Where(s => strList.Contains(s));
string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };
var result = str.Split(',').Intersect(strList);
Console.WriteLine(string.Join(", ", result));
var results = (from main in str.Split(',')
                join key in strList
                on main equals key
                select main).ToList();