【问题标题】:Convert comma separated string of ints to int array将逗号分隔的整数字符串转换为整数数组
【发布时间】:2009-11-19 14:19:34
【问题描述】:

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

这是我的实现(灵感来自this post by 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;
                }
            }
        }
    }

您认为这是一个好方法还是有更简单,甚至内置的方法?

编辑:抱歉有任何混淆,但该方法需要通过跳过处理无效输入,如 "1,2,,,3" 或 "###, 5," 等。

【问题讨论】:

  • 不使用foreach 会使代码变得不必要地复杂化。您复制的帖子正在解决一个完全不同的问题。

标签: c#


【解决方案1】:

您应该使用 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;
    }
}

请注意,就像您的原始帖子一样,这将忽略无法解析的数字。

如果您想在无法解析数字的情况下抛出异常,您可以使用 LINQ 更简单地做到这一点:

return (str ?? "").Split(',').Select<string, int>(int.Parse);

【讨论】:

    【解决方案2】:

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

    return text.Split(',').Select(x => int.Parse(x));
    

    否则,我会使用额外的辅助方法(as seen this morning!):

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

    和:

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

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

    return text.Split(',').Select(t => t.TryParseInt32(t)
                          .Where(x => x.HasValue)
                          .Select(x => x.Value);
    

    或查询表达式形式:

    return from t in text.Split(',')
           select TryParseInt32(t) into x
           where x.HasValue
           select x.Value;
    

    【讨论】:

    • 对于一个 java/c# 的人来说,你的答案对我来说似乎总是很实用 :=)
    • 说到 LINQ,这并不奇怪 :)
    • 为什么不想使用方法组转换?
    • 有些人可能更喜欢具有更好类型推断的 lambda。我喜欢提供选项:)
    • @BimalDas:是的,否则结果将是IEnumerable&lt;int?&gt; 而不是IEnumerable&lt;int&gt;。
    【解决方案3】:

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

    Array.ConvertAll<string, int>(value.Split(','), Convert.ToInt32);
    

    【讨论】:

    • 我发现我不需要这部分&lt;string, int&gt;
    【解决方案4】:

    --EDIT-- 看起来我把他的问题标题过于字面化了——他要求的是一个整数数组而不是一个 List --EDIT ENDS--

    又一个辅助方法...

    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();
    }
    

    也可以快速测试它的代码...

    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();
    }
    

    【讨论】:

      【解决方案5】:

      以前有人问过这个问题。 .Net 有一个内置的 ConvertAll 函数,用于将一种类型的数组转换为另一种类型的数组。您可以将其与 Split 结合使用,将字符串分隔为字符串数组

      示例函数:

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

      Taken from here

      【讨论】:

        【解决方案6】:

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

        int[] input = Console.ReadLine()
                    .Split(',', StringSplitOptions.RemoveEmptyEntries)
                    .Select(int.Parse)
                    .ToArray();
        

        【讨论】:

          【解决方案7】:

          这是长期的,但您可以轻松修改它以使用整数。

          private static long[] ConvertStringArrayToLongArray(string str)
          {
              return str.Split(",".ToCharArray()).Select(x => long.Parse(x.ToString())).ToArray();
          }
          

          【讨论】:

          • 这将抛出无法解析的数字;他似乎想跳过它们。
          • 这不做同样的事情。他的版本通过跳过它们来优雅地处理非整数。
          • 好点,但我是按照他提供的输入示例进行的:string str = "1,2,3,4,5"
          • 这根本行不通;你忘了打电话给Split。这将枚举字符串中的每个字符,并将抛出,。
          • 哎呀,你是对的。对不起,我已经更正了。但这仅适用于有效输入。
          【解决方案8】:

          我不明白为什么明确取出枚举器比使用 foreach 更有优势。也无需在chunks 上致电AsEnumerable。

          【讨论】:

            【解决方案9】:

            我找到了一个对我有用的简单解决方案。

            String.Join(",",str.Split(','));

            【讨论】:

            • 这根本没有回答问题,看起来你会得到与你开始时完全相同的字符串。
            【解决方案10】:
            import java.util.*;
            import java.io.*;
            public class problem
            {
            public static void main(String args[])enter code here
            {
              String line;
              String[] lineVector;
              int n,m,i,j;
              Scanner sc = new Scanner(System.in);
              line = sc.nextLine();
              lineVector = line.split(",");
              //enter the size of the array
              n=Integer.parseInt(lineVector[0]);
              m=Integer.parseInt(lineVector[1]);
              int arr[][]= new int[n][m];
              //enter the array here
              System.out.println("Enter the array:");
              for(i=0;i<n;i++)
              {
              line = sc.nextLine();
              lineVector = line.split(",");
              for(j=0;j<m;j++)
              {
              arr[i][j] = Integer.parseInt(lineVector[j]);
              }
              }
              sc.close();
            }
            }
            

            在第一行输入数组的大小,用逗号分隔。然后输入以逗号分隔的数组中的值。结果存储在数组 arr 中。 例如 输入: 2,3 1,2,3 2,4,6 将值存储为 arr = {{1,2,3},{2,4,6}};

            【讨论】:

              猜你喜欢
              • 2011-06-12
              • 1970-01-01
              • 2018-11-09
              • 1970-01-01
              • 2014-01-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多