繁体   English   中英

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

[英]Convert comma separated string of ints to int array

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

这是我的实现(受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 循环,如下所示:

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

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

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

否则,我会使用额外的辅助方法(如今天早上所见!)

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;

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

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

--编辑--看起来我把他的问题标题写得太字面了-他要求的是一个整数数组而不是一个列表--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();
}

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

示例函数:

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

取自这里

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

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

这是 longs,但您可以轻松修改它以使用 ints。

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

我不明白为什么去掉枚举器比使用foreach任何优势。 也不需要在chunks上调用AsEnumerable

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

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

我认为已经足够好了。 很明显,它很懒,所以它会很快(除了第一种情况,当你拆分字符串时)。

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中。 例如input: 2,3 1,2,3 2,4,6将值存储为arr = {{1,2,3},{2,4,6}};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM