给出变量
string ids = Request.QueryString["ids"]; // "1,2,3,4,5";
有没有办法将它转换成List而不做像
这样的事情List<int> myList = new List<int>();
foreach (string id in ids.Split(','))
{
if (int.TryParse(id))
{
myList.Add(Convert.ToInt32(id));
}
}
答案 0 :(得分:48)
要从头开始创建列表,请使用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 => x.P)
.Select(x => x.I)
.ToList();
避免temps / TryParse但跳过无效条目的最后一个(较慢)方法是使用Regex:
var myList = Regex.Matches(ids, "[0-9]+").Cast<Match>().SelectMany(m => m.Groups.Cast<Group>()).Select(g => int.Parse(g.Value));
但是,如果其中一个条目溢出int(999999999999),则可能抛出此内容。
答案 1 :(得分:8)
这应该可以解决问题:
myList.Split(',').Select(s => Convert.ToInt32(s)).ToList();
如果列表可能包含除整数之外的其他数据,则应包括TryParse
调用。请参阅接受的答案。
答案 2 :(得分:4)
使用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<string, int>)int.Parse);
(提示:微观优化。)
如果可能无效输入并且应该以静默方式处理,则还应使用TryParse
代替Parse
(仅限)TryParse
。但是,其他人使用{{1}}发布了解决方案,所以我当然不会。请记住,您不应该重复计算。
答案 3 :(得分:3)
或者在示例中包含TryParse
:
var res = ids.Split(',').Where(x => { int tmp; return int.TryParse(x, out tmp); }).Select(x => int.Parse(x)).ToList();
答案 4 :(得分:3)
为了在性能特征和行为方面匹配请求,它应该做同样的事情而不是去做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();
答案 5 :(得分:2)
这里的一个问题是我们将如何处理非整数的值(假设我们会得到一些不是整数的值)。一个想法可能是简单地使用正则表达式:
^ - [0-9] + $
现在,我们可以将所有这些结合起来(如Konrad的例子所示):
var myList = ids.Split(',').Where(s => Regex.IsMatch(s, "^-?[0-9]$")).Select(s => Convert.ToInt32(s)).ToList();
那应该做的。