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

C# 将逗号分隔的整数字符串转换为整数数组,c#,C#,我只找到了一种相反的方法:从int列表或数组中创建一个逗号分隔的字符串,而不是如何转换输入,比如string str=“1,2,3,4,5”到数组或整数列表 以下是我的实现(灵感来自于): 公共静态IEnumerable StringToIntList(字符串str) { if(String.IsNullOrEmpty(str)) { 屈服断裂; } var chunks=str.Split(',').AsEnumerable(); 使用(var=chunks.GetEnumerator())

我只找到了一种相反的方法:从int列表或数组中创建一个逗号分隔的字符串,而不是如何转换输入,比如
string str=“1,2,3,4,5”到数组或整数列表

以下是我的实现(灵感来自于):

公共静态IEnumerable StringToIntList(字符串str)
{
if(String.IsNullOrEmpty(str))
{
屈服断裂;
}
var chunks=str.Split(',').AsEnumerable();
使用(var=chunks.GetEnumerator())
{
while(rator.MoveNext())
{
int i=0;
if(Int32.TryParse(rator.Current,out i))
{
收益率i;
}
其他的
{
继续;
}
}
}
}
你认为这是一个好方法,还是有一种更简单,甚至是内置的方法


编辑:很抱歉出现任何混淆,但是该方法需要处理无效输入,如
“1,2,3”
“###,5”
等,跳过它。

这是一个很长的过程,但您可以轻松地修改它以使用ints

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

您应该使用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;
    }
}
公共静态IEnumerable StringToIntList(字符串str){
if(String.IsNullOrEmpty(str))
屈服断裂;
foreach(str.Split(',')中的变量s){
int-num;
if(int.TryParse(s,out num))
收益数;
}
}
请注意,与您原来的帖子一样,这将忽略无法解析的数字

如果您想在无法解析数字时引发异常,则可以使用LINQ更简单地执行此操作:

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

我不明白为什么去掉枚举器会比使用
foreach
有任何优势。也没有必要在
块上调用
aseneumerable
,我认为这样就足够了。很明显,它是懒惰的,所以速度很快(可能第一次拆分字符串时除外)。

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

return text.Split(',').Select(x => int.Parse(x));
否则,我将使用一个额外的助手方法:

以及:

或以查询表达式形式:

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

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

示例函数:

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

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

在不使用lambda函数且仅用于有效输入的情况下,我认为这样做更清晰:

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

我找到了一个简单的解决方案,对我很有效

String.Join(“,”,str.Split(“,”)

导入java.util.*;
导入java.io.*;
公共阶级问题
{
publicstaticvoidmain(字符串args[])在此处输入代码
{
弦线;
字符串[]线向量;
int n,m,i,j;
扫描仪sc=新的扫描仪(System.in);
line=sc.nextLine();
lineVector=直线分割(“,”);
//输入数组的大小
n=整数.parseInt(lineVector[0]);
m=整数.parseInt(lineVector[1]);
整数arr[][]=新整数[n][m];
//在这里输入数组
System.out.println(“输入数组:”);

对于(i=0;i让我们假设您将从console.Import System.Linq读取字符串,然后尝试以下操作:

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

这将抛出不可解析的数字;他似乎想跳过这些数字。这与此不同。他的版本通过跳过这些数字来优雅地处理非整数。说得好,但我使用了他提供的输入示例:string str=“1,2,3,4,5”这根本不起作用;您忘记调用
Split
。这将枚举字符串中的每个字符,并将引发
。哦,您是对的。抱歉,我已经更正了。但这只适用于有效输入。您不使用
foreach
,不必要地使代码复杂化。您从中复制的帖子是解决一个完全不同的问题。对于一个java/c的家伙来说,你的答案在我看来总是很实用:=)说到LINQ,这并不完全令人惊讶:)为什么不想使用方法组转换?有些人可能更喜欢lambda,它具有更好的类型推断。我喜欢提供选项:)@BimalDas:是的,因为否则结果将是
IEnumerable
而不是
IEnumerable
。我不同意,这是真的ly应该使用
foreach
,这会让它更清晰。而且,它不必要的冗长。我说,足够好,不完美。它不会伤害我的眼睛,你只是顺其自然,去做另一件事……谢谢,很好!比我的方法简单多了。有一个{但是在foreach之后丢失了。非常好而且简单的解决方案。我发现我不需要这个部分
,这根本不能回答问题,而且看起来你会得到与开始时完全相同的字符串。
 static int[] ToIntArray(this string value, char separator)
 {
     return Array.ConvertAll(value.Split(separator), s=>int.Parse(s));
 }
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();
}
Array.ConvertAll<string, int>(value.Split(','), Convert.ToInt32);
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();
}
}
int[] input = Console.ReadLine()
            .Split(',', StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse)
            .ToArray();