如何从逗号分隔的字符串创建List ?

鉴于变量

string ids = Request.QueryString["ids"]; // "1,2,3,4,5"; 

有没有办法将它转换成List而不做类似的事情

 List myList = new List(); foreach (string id in ids.Split(',')) { if (int.TryParse(id)) { myList.Add(Convert.ToInt32(id)); } } 

要从头开始创建列表,请使用LINQ:

 ids.Split(',').Select(i => int.Parse(i)).ToList(); 

如果您已有列表对象,请省略ToList()调用并使用AddRange:

 myList.AddRange(ids.Split(',').Select(i => int.Parse(i))); 

如果字符串中的某些条目可能不是整数,则可以使用TryParse:

 int temp; var myList = ids.Split(',') .Select(s => new { P = int.TryParse(s, out temp), I = temp }) .Where(x => xP) .Select(x => xI) .ToList(); 

避免temps / TryParse但跳过无效条目的最后一个(较慢)方法是使用Regex:

 var myList = Regex.Matches(ids, "[0-9]+").Cast().SelectMany(m => m.Groups.Cast()).Select(g => int.Parse(g.Value)); 

但是,如果您的某个条目溢出int(999999999999),则可能抛出此exception。

这应该是诀窍:

 myList.Split(',').Select(s => Convert.ToInt32(s)).ToList(); 

如果列表可能包含除整数之外的其他数据,则应包括TryParse调用。 看到接受的答案。

使用Linq:

 myList.AddRange(ids.Split(',').Select(s => int.Parse(s)); 

或直接:

 var myList = ids.Split(',').Select(s => int.Parse(s)); 

另外,为了防止编译器显式生成(很大程度上是冗余的)lambda,请考虑:

 var myList = ids.Split(',').Select((Func)int.Parse); 

(提示:微观优化。)

如果无效输入可以使用TryParse而不是Parse (仅限),应该静默处理。 但是,其他人已经使用TryParse发布了解决方案,所以我当然不会。 请记住,您不应该重复计算。

或者在您的示例中包含TryParse

 var res = ids.Split(',').Where(x => { int tmp; return int.TryParse(x, out tmp); }).Select(x => int.Parse(x)).ToList(); 

为了在性能特征和行为方面匹配请求,它应该做同样的事情,而不是去做doign正则表达式或不做’TryParse’: –

 ds.Split(',') .Select( i => { int value; bool valid = int.TryParse(out value); return new {valid, value} }) .Where(r=>r.valid) .Select(r=>r.value) .ToList(); 

但是虽然正确,但这很难看:D

借鉴杰森评论的暗示: –

 ds.Split(',') .Select( i => { int value; bool valid = int.TryParse(out value); return valid ? new int?( value) : null; }) .Where(r=>r != null) .Select(r=>r.Value) .ToList(); 

要么

 static class Convert { public static Int32? ConvertNullable(this string s) { int value; bool valid = int.TryParse(out value); return valid ? new int?( value) : null; } } ds.Split(',') .Select( s => Convert.ConvertNullable(s)) .Where(r=>r != null) .Select(r=>r.Value) .ToList(); 

这里的一个问题是我们将如何处理非整数的值(假设我们将得到一些不是整数的值)。 一个想法可能是简单地使用正则表达式:

^ – ?[0-9] + $

现在,我们可以将所有这些结合起来(如Konrad的例子所示):

 var myList = ids.Split(',').Where(s => Regex.IsMatch(s, "^-?[0-9]$")).Select(s => Convert.ToInt32(s)).ToList(); 

那应该做的。