如何将逗号分隔的字符串转换为List<int>?

267
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',');

这不起作用是因为split方法返回一个字符串数组。

11个回答

554

以下是一种实现方式:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

13
这段代码可以翻译为:List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));,意思是将字符串类型的tags以逗号分隔后,转换成int类型,并存储在一个整型列表中。 - phoog
2
需要使用 new List<> 吗? - LiquidPony
3
不可以,你可以调用 ToList() 方法代替;结果基本相同:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); 但你必须选择其中之一,因为 Select() 的返回值是一个 IEnumerable<> 而不是一个 List<> - phoog
10
为处理标签为空字符串的情况,请使用 Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries) - TrueWill
如何做相同的事情,但是使用List<string>而不是List<int>? - user2603796
显示剩余4条评论

42

如果您想包含一些简单的验证并跳过无效值(而不是抛出异常),这里有一个使用TryParse的示例:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

编辑:根据Antoine的反馈,这里是更新后的查询。它首先调用TryParse来过滤掉任何错误的值,然后再调用Parse进行实际转换。

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

编辑2: 根据 Charles Burns 的反馈,更新了 C# 7.0 的查询。请注意,使用这种方法可以摆脱额外的 mos 变量,因此更加简洁。

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
如果0是一个合法的输入,则失败! - Antoine Meltzheim
2
使用 C# 7.0,您可以省略 mos 的声明并将 TryParse 调用替换为 int.TryParse(m, out int _) - Charles Burns
可以进一步简化为 return str.Split(',').Where(m => int.TryParse(m, out int _)).Select(int.Parse).ToList(); - Matěj Štágl

18

您可以使用 LINQ w/ int.Parse()string[] 转换为 IEnumerable<int>,然后将该结果传递给 List<T> 构造函数:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));

15

如果没有使用LINQ查询,您可以选择这种方法,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

然后你可以将这个列表转换为整数类型...


1
只是提醒一下不熟悉的人,.ToList<string>() 仍然需要 using System.Linq; - Bill Rawlinson

14
一点点LINQ也能发挥很大作用:
 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();

6
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();

2
根据 https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-a-string-to-a-number#example您不需要添加 .Select(x => x.Trim(),因为 Parse 会自动为您修剪任何空格字符。 - Phillip Quinlan

3
如果您正在使用C# 3.5,则可以使用Linq来实现此目的。
string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

或者简短一点。
string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();

2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

2

我偶然发现了这个问题,想要分享一下自己的解决方案,而不使用linq。这是一种基本的方法。非整数值也不会被添加到列表中。

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

希望这可以帮到你。

1

我对khalid13的答案进行了修改。如果用户输入了字符串“0”,他的答案会将其从结果列表中删除。我做了类似的事情,但使用了匿名对象。

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection是我制作的一个自定义函数,用于保护字符串是否为空。

上述函数的作用是去除任何无法转换的字符串而不产生错误。如果需要在转换出现问题时引发错误,则应使用接受的答案。


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