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


Answers:


432

这是一种实现方法:

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

11
那也可能是List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog,2012年

2
是否需要new List<>
LiquidPony 2012年

2
@LiquidPony没有; 你可以打电话给ToList(); 结果本质上是相同的:但是,List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); 您需要做一个或另一个,因为返回值Select()是an IEnumerable<>,而不是aList<>
phoog 2012年

@LiquidPony在此实现中为是,因为Select在这种情况下扩展名返回IEnumerable<Int32>且未列出。但是list具有一个接受另一个集合作为源的构造函数。
Oybek '02

8
要处理标签为空字符串的情况,请使用Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill 2014年

24

如果要包括一些简单的验证并跳过无效值(而不是引发异常),则可以使用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是一个合法输入,则失败!
安托万·梅尔茨海姆

2
使用C#7.0,您可以省略mos声明,并用int.TryParse(m, out int _)
Charles Burns

14

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

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


6

如果没有LINQ Query,则可以选择此方法,

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

然后您可以将此列表转换为整数类型...


只是给不熟悉的人的便笺= .ToList<string>()仍然需要using System.Linq;
Bill Rawlinson


2

如果您使用的是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();

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是我制作的自定义函数,用于保护字符串是否为空。

上面的操作是删除所有没有错误转换的字符串。如果转换出现问题时需要出错,那么应该接受公认的答案。


1

我偶然发现了这个问题,我只想分享自己的解决方案而无需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);
    }
}

希望这可以帮助。


-2

这很简单。首先分割字符串。修剪逗号(,)后的空白。然后使用系统定义的ToList()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

要删除','之后的空格,并将此逗号分隔的文本转换为List

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.