我有一个字符串和一个字符串列表。我正在尝试返回一个列表,无论 strList 包含在 str 中,结果都应该是 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" };
var splitStr = str.Split(',');
var result = splitStr.Where(x => strList.Contains(x));
string str= "21,1,4";
List<string> strList= new List<string> { "4","21" };
string[] result = str.Split(',');
foreach(string s in result)
if(strList.Contains(s))
Console.WriteLine(s);
让它变得简单。
将所有内容保持在一行上,这似乎是您的目标:
string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };
var a = str.Split(',').Where(s => strList.Contains(s));
a
将是 str 中包含的所有值(拆分后)的 IEnumerable,这些值包含在 strList
中。
你可以只使用Intersect
string str = "21,1,4";
List<string> strList = new List<string> { "4", "21" };
var result = str.Split(',').Intersect(strList);
Console.WriteLine(string.Join(", ", result));
输出:
21, 4
代码的问题在于,通过执行str.Where
,您将迭代字符串的字符。 相反,您应该拆分str
然后迭代以查找strList
中的匹配项。
你可以做
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();
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);
commonStrings
是您正在寻找的答案。
优雅的 Join 语法怎么样:
var results = (from main in str.Split(',')
join key in strList
on main equals key
select main).ToList();
如果要删除重复项(如果str
有重复项),可以在.ToList()
之前添加.Distinct()
。