将逗号分隔的int字符串转换为int数组

Max*_*Max 54 c#

我只找到了一种相反的方法:从int列表或数组创建一个逗号分隔的字符串,但不是如何将输入转换string str = "1,2,3,4,5";为数组或int列表.

这是我的实现(灵感来自Eric Lippert这篇文章):

    public static IEnumerable<int> StringToIntList(string str)
    {
        if (String.IsNullOrEmpty(str))
        {
            yield break;
        }

        var chunks = str.Split(',').AsEnumerable();

        using (var rator = chunks.GetEnumerator())
        {
            while (rator.MoveNext())
            {
                int i = 0;

                if (Int32.TryParse(rator.Current, out i))
                {
                    yield return i;
                }
                else
                {
                    continue;
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

你认为这是一个好方法还是更简单,甚至可能是内置方式?

编辑:对不起任何混乱,但该方法需要处理等无效的输入"1,2,,,3""###, 5,"通过跳过它等等.

SLa*_*aks 71

你应该使用foreach循环,如下所示:

public static IEnumerable<int> StringToIntList(string str) {
    if (String.IsNullOrEmpty(str))
        yield break;

    foreach(var s in str.Split(',')) {
        int num;
        if (int.TryParse(s, out num))
            yield return num;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,与原始帖子一样,这将忽略无法解析的数字.

如果要在无法解析数字时抛出异常,可以使用LINQ更简单地执行此操作:

return (str ?? "").Split(',').Select<string, int>(int.Parse);
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 65

如果您不想拥有当前的错误处理行为,那很简单:

return text.Split(',').Select(x => int.Parse(x));
Run Code Online (Sandbox Code Playgroud)

否则,我会使用一个额外的帮助方法(今天早上看到!):

public static int? TryParseInt32(string text)
{
    int value;
    return int.TryParse(text, out value) ? value : (int?) null;
}
Run Code Online (Sandbox Code Playgroud)

和:

return text.Split(',').Select<string, int?>(TryParseInt32)
                      .Where(x => x.HasValue)
                      .Select(x => x.Value);
Run Code Online (Sandbox Code Playgroud)

或者如果您不想使用方法组转换:

return text.Split(',').Select(t => t.TryParseInt32(t)
                      .Where(x => x.HasValue)
                      .Select(x => x.Value);
Run Code Online (Sandbox Code Playgroud)

或者在查询表达式中:

return from t in text.Split(',')
       select TryParseInt32(t) into x
       where x.HasValue
       select x.Value;
Run Code Online (Sandbox Code Playgroud)

  • 有些人可能更喜欢具有更好类型推断的lambda.我想提供选项:) (4认同)

McT*_*fik 27

不使用lambda函数和仅用于有效输入,我认为这样做更清楚:

Array.ConvertAll<string, int>(value.Split(','), Convert.ToInt32);
Run Code Online (Sandbox Code Playgroud)

  • 我发现我不需要这个部分`<string,int>` (2认同)

Zom*_*eep 6

--EDIT--看起来我的问题标题太过于字面意思 - 他要求的是一系列的整数而不是一个清单 - 编辑结束 -

另一种辅助方法......

private static int[] StringToIntArray(string myNumbers)
{
    List<int> myIntegers = new List<int>();
    Array.ForEach(myNumbers.Split(",".ToCharArray()), s =>
    {
        int currentInt;
        if (Int32.TryParse(s, out currentInt))
            myIntegers.Add(currentInt);
    });
    return myIntegers.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

它的快速测试代码......

static void Main(string[] args)
{
    string myNumbers = "1,2,3,4,5";
    int[] myArray = StringToIntArray(myNumbers);
    Console.WriteLine(myArray.Sum().ToString()); // sum is 15.

    myNumbers = "1,2,3,4,5,6,bad";
    myArray = StringToIntArray(myNumbers);
    Console.WriteLine(myArray.Sum().ToString()); // sum is 21

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*tor 6

让我们假设您将从控制台读取字符串。导入 System.Linq 并尝试这个:

int[] input = Console.ReadLine()
            .Split(',', StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray();
Run Code Online (Sandbox Code Playgroud)


bad*_*d99 5

这已经被问过了。.Net具有内置的ConvertAll函数,用于在一种类型的数组与另一种类型的数组之间进行转换。您可以将其与Split结合使用,以将字符串分隔为字符串数组

示例功能:

 static int[] ToIntArray(this string value, char separator)
 {
     return Array.ConvertAll(value.Split(separator), s=>int.Parse(s));
 }
Run Code Online (Sandbox Code Playgroud)

从这里取