将逗号分隔的字符串解析成可循环访问单个值的对象的最简单方法是什么?

63

如何将逗号分隔的字符串值列表解析成某种对象,以便可以循环访问每个值并轻松地访问各个值?

例如字符串:"0, 10, 20, 30, 100, 200"

我有点新手C#,所以请原谅我提出这样一个简单的问题。谢谢。


回复:我的答案 - 如果您实际上也将它们视为数字,则如果您有兴趣,还有其他解析它们的容错策略。我确实开始添加它们 - 但感觉这实际上是太多信息了。 - Andras Zoltan
其实是的,我确实需要它们作为数字,但是我刚刚实现了它,跟着你的代码很容易。一切都正常工作。谢谢! - ycomp
7个回答

153

使用这种方法有一些需要注意的地方,但最终最简单的方法将是使用

string s = [yourlongstring];
string[] values = s.Split(',');

如果逗号和条目的数量不重要,并且您想要摆脱“空”值,那么可以使用:

string[] values = s.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

不过有一点需要注意,这会保留你的字符串前后的任何空格。你可以使用一些 Linq 魔法来解决这个问题:

string[] values = s.Split(',').Select(sValue => sValue.Trim()).ToArray();

如果你正在使用 .Net 3.5 并且在源文件的顶部有 using System.Linq 声明,那么就是这样的。


需要注意的是,还有一种正则表达式解决方案可以处理两侧的空格。但这是最直接的方法。 - Andras Zoltan
1
添加@Andras的评论。我也会使用正则表达式来确保每个值都是数字并剥离其他字符。模式? "(?<value> \d +)",然后您可以在每个 Match.Groups["value"] 中获取它。您还可以在此过程中将它们转换为整数。 - Robert Koritnik
1
我改编了其中一些代码,创建了List<long> userIds = usersList.Split(',').Select(sValue => long.Parse(sValue.Trim())).ToList(); - Manish

26
   var stringToSplit = "0, 10, 20, 30, 100, 200";

    // To parse your string 
    var elements = test.Split(new[]
    { ',' }, System.StringSplitOptions.RemoveEmptyEntries);

    // To Loop through
    foreach (string items in elements)
    {
       // enjoy
    }

8
使用Linq,这是一种非常快速和简单的方法。
string mystring = "0, 10, 20, 30, 100, 200";

var query = from val in mystring.Split(',')
            select int.Parse(val);
foreach (int num in query)
{
     Console.WriteLine(num);
}

4
使用 Linq 是否有些过度了?.split() 返回的是一个数组,你可以直接循环遍历。使用 Linq 会增加代码复杂度,却没有实际好处。如果说有什么好处,那就是降低了代码可读性。 - Simon P Stevens
但是很容易理解正在发生的事情,编译器将查询翻译成表达式树,就像使用lambda查询一样。 - martin
3
@Stevens,你可以使用for循环来处理几乎任何东西,并获得与Linq相同的结果。我个人更喜欢mystring.Split().Select()这种语法,因为我更熟悉它,但我认为@martin的代码并不会因为使用了“高级”的C#特性就变得难以阅读。 - strager
实际上,我不能在我的代码中使用Linq,因为我正在运行.NET 2.0版本,但还是谢谢。 - ycomp
是啊,说实话这主要还是因人而异吧。我经常使用Linq来处理数据对象,但这种方法对我来说有点牵强。不过就像你说的,每个人都有自己的风格。 - Simon P Stevens

4
该模式匹配所有非数字字符。这将限制您只能使用非负整数,但对于您的示例来说,这已经足够了。
string input = "0, 10, 20, 30, 100, 200";
Regex.Split(input, @"\D+");

3

2
有时列内会有逗号,例如:

"一些项目","另一个项目","还有一个项目,也是"

在这种情况下,根据逗号分割可能会破坏某些列。也许有更简单的方法,但我自己开发了一种方法(作为奖励,处理逗号后面的空格并返回IList):
private IList<string> GetColumns(string columns)
{
    IList<string> list = new List<string>();

    if (!string.IsNullOrWhiteSpace(columns))
    {
        if (columns[0] != '\"')
        {
            // treat as just one item
            list.Add(columns);
        }
        else
        {
            bool gettingItemName = true;
            bool justChanged = false;
            string itemName = string.Empty;

            for (int index = 1; index < columns.Length; index++)
            {
                justChanged = false;
                if (subIndustries[index] == '\"')
                {
                    gettingItemName = !gettingItemName;
                    justChanged = true;
                }

                if ((gettingItemName == false) &&
                (justChanged == true))
                {
                    list.Add(itemName);
                    itemName = string.Empty;
                    justChanged = false;
                }

                if ((gettingItemName == true) && (justChanged == false))
                {
                    itemName += columns[index];
                }
            }
        }
    }

    return list;
}

1
使用循环处理分割后的值。
string values = "0,1,2,3,4,5,6,7,8,9";

foreach(string value in values.split(','))
{
    //do something with individual value
}

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