如何从逗号分隔的字符串创建List <t>?</t>

时间:2009-05-26 10:59:29

标签: c# generics

给出变量

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));
    }
}

6 个答案:

答案 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();

那应该做的。