在一行代码中将字符串拆分并转换为整型列表

249

我有一个包含数字的字符串。

string sNumbers = "1,2,3,4,5";
我可以将它分割然后转换为List<int>
sNumbers.Split( new[] { ',' } ).ToList<int>();

我该如何将字符串数组转换为整数列表? 这样我就能将string[]转换为IEnumerable了。


今天我们有完全相同的问题: 点击我 - Dario
3
"一行代码"是一个非常严格的要求!</perl> - dfa
2
这个问题明确要求拆分一个数字字符串,这使得答案简单明了。Dario提到的那个问题涉及到一般字符串的TryParse问题。 - goodeye
11个回答

613
var numbers = sNumbers?.Split(',')?.Select(Int32.Parse)?.ToList();

从C#的最新版本(v6+)开始,你可以使用空值条件运算符来进行内联的空值检查。


7
当列表具有空值或null时,会出现异常。 - Sayed Muhammad Idrees
在拆分之前,请先检查是否为 null 或空。 - RAVI VAGHELA
7
添加一个空值检查:var numbers = sNumbers?.Split(',').Select(Int32.Parse).ToList(); - Michael G
1
已更新答案以反映@MichaelG提到的空值检查。 - Ifeoluwa Osungade
如何将其转换为List<long>?Select(Int64.Parse)显示错误。 - yuv

42

最好使用 int.TryParse 来避免异常;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();

39

你也可以这样做,而不需要使用 Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();

20

Joze的方法也需要使用LINQ,ToList()位于System.Linq命名空间中。

您可以通过将数组传递给List构造函数来将数组转换为列表,而无需使用Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

13

也可以直接将整数数组分配给变量。

像这样:

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();

6

你可以使用新的C# 6.0语言特性:

  • 用相应的方法组Convert.ToInt32替换委托(s) => { return Convert.ToInt32(s); }
  • Convert.ToInt32替换冗余的构造函数调用:new Converter<string, int>(Convert.ToInt32)

结果将是:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));

4

您也可以使用该扩展方法。

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

使用方法:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');

3
在Unity3d中,int.Parse不起作用。所以我使用下面的方法。
List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

希望这对Unity3d用户有所帮助。

2

我的问题类似,但有时字符串包含字母(有时为空)。

string sNumbers = "1,2,hh,3,4,x,5";

尝试遵循 Pcode Xonos 扩展方法:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}

1
谢谢,虽然你声明了一个分隔符,但你并没有使用它。 - Hugo Delsing

1

既然我们有泛型,为什么还要坚持使用 int 类型呢? 不如考虑像这样的扩展方法:

    public static List<T> Split<T>(this string @this, char separator, out bool AllConverted)
    {
        List<T> returnVals = new List<T>();
        AllConverted = true;
        var itens = @this.Split(separator);
        foreach (var item in itens)
        {
            try
            {
                returnVals.Add((T)Convert.ChangeType(item, typeof(T)));
            }
            catch { AllConverted = false; }
        }
        return returnVals;
    }

然后

 string testString = "1, 2, 3, XP, *, 6";
 List<int> splited = testString.Split<int>(',', out _);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接