我只是找到了一种相反的方法:从int列表或数组创建一个逗号分隔的字符串,但不是如何将string str = "1,2,3,4,5";
之类的输入转换为数组或整数列表。< / p>
这是我的实现(受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,"
等无效输入。
答案 0 :(得分:66)
您应该使用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);
答案 1 :(得分:62)
如果您不想拥有当前的错误处理行为,那很简单:
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;
答案 2 :(得分:27)
不使用lambda函数和仅用于有效输入,我认为这样做更清楚:
Array.ConvertAll<string, int>(value.Split(','), Convert.ToInt32);
答案 3 :(得分:6)
- 编辑 - 看起来我把他的问题标题化得过于字面 - 他要求的是一系列的整数而不是一个列表 - 编辑结束 -
另一种辅助方法......
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();
}
答案 4 :(得分:5)
以前曾经问过这个问题。 .Net有一个内置的ConvertAll函数,用于在一种类型的数组和另一种类型的数组之间进行转换。您可以将其与Split组合以将字符串分隔为字符串数组
示例功能:
static int[] ToIntArray(this string value, char separator)
{
return Array.ConvertAll(value.Split(separator), s=>int.Parse(s));
}
答案 5 :(得分:2)
这是多余的,但您可以轻松修改它以使用整数。
private static long[] ConvertStringArrayToLongArray(string str)
{
return str.Split(",".ToCharArray()).Select(x => long.Parse(x.ToString())).ToArray();
}
答案 6 :(得分:2)
让我们假设您将从控制台读取字符串。导入System.Linq并尝试执行以下操作:
int[] input = Console.ReadLine()
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
答案 7 :(得分:1)
我不明白为什么拿出枚举器显然比使用foreach
更有优势。您也无需在AsEnumerable
上致电chunks
。
答案 8 :(得分:0)
我觉得很好。很明显,它很懒,所以速度很快(除了分裂字符串的第一种情况)。
答案 9 :(得分:0)
我找到了一个对我有用的简单解决方案。
String.Join(",",str.Split(','));
答案 10 :(得分:-1)
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}};