如何从逗号分隔的字符串创建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();
那应该做的。