C# 将字符串数组拆分为锯齿状对象数组
我想用名称值和一些数字(即字符串)创建一个字符串数组 我想将它们传递到一个函数中,该函数将获取数组,然后将它们拆分为一个对象交错数组(1个字符串数组和1个整数数组)C# 将字符串数组拆分为锯齿状对象数组,c#,arrays,function,jagged-arrays,C#,Arrays,Function,Jagged Arrays,我想用名称值和一些数字(即字符串)创建一个字符串数组 我想将它们传递到一个函数中,该函数将获取数组,然后将它们拆分为一个对象交错数组(1个字符串数组和1个整数数组) 阵列是: string[] str= { "toto", "the", "moto", "my", "friend","12","13","14","99","88"}; 函数如下所示: public object[][] bloop (string[] bstr) { } 下一步是什么 您的场景看起来像糟糕的设计,可能会导致
阵列是:
string[] str= { "toto", "the", "moto", "my", "friend","12","13","14","99","88"};
函数如下所示:
public object[][] bloop (string[] bstr)
{
}
下一步是什么 您的场景看起来像糟糕的设计,可能会导致错误和性能问题。更好的方法是更改使用generic
List
之类的代码。但在您当前的问题中,您可以使用以下代码:
public object[][] bloop (string[] bstr)
{
var numbers = new List<int>();
var strings = new List<string>();
var result = new object[2][];
foreach(var str in bstr)
{
int number = 0;
if(int.TryParse(str, out number))
{
numbers.Add(number);
}
else
{
strings.Add(str);
}
}
result[0] = strings.ToArray();
result[1] = numbers.ToArray();
return result;
}
public object[]bloop(string[]bstr)
{
变量编号=新列表();
var strings=新列表();
var结果=新对象[2][];
foreach(bstr中的var str)
{
整数=0;
if(内部锥虫(str,外部编号))
{
数字。添加(数字);
}
其他的
{
strings.Add(str);
}
}
结果[0]=strings.ToArray();
结果[1]=numbers.ToArray();
返回结果;
}
您的场景看起来像糟糕的设计,可能会导致错误和性能问题。更好的方法是更改使用genericList
之类的代码。但在您当前的问题中,您可以使用以下代码:
public object[][] bloop (string[] bstr)
{
var numbers = new List<int>();
var strings = new List<string>();
var result = new object[2][];
foreach(var str in bstr)
{
int number = 0;
if(int.TryParse(str, out number))
{
numbers.Add(number);
}
else
{
strings.Add(str);
}
}
result[0] = strings.ToArray();
result[1] = numbers.ToArray();
return result;
}
public object[]bloop(string[]bstr)
{
变量编号=新列表();
var strings=新列表();
var结果=新对象[2][];
foreach(bstr中的var str)
{
整数=0;
if(内部锥虫(str,外部编号))
{
数字。添加(数字);
}
其他的
{
strings.Add(str);
}
}
结果[0]=strings.ToArray();
结果[1]=numbers.ToArray();
返回结果;
}
我同意您的要求听起来很奇怪,应该用不同的方法来解决。但是,这将满足您的要求:
public T[][] Bloop<T>(T[] items)
{
if (items == null) throw new ArgumentNullException("items");
if (items.Length == 1) return new T[][] { items, new T[] { } };
int firstLength = (int) Math.Ceiling((double)items.Length / 2);
T[] firstPart = new T[firstLength];
Array.Copy(items, 0, firstPart, 0, firstLength);
int secondLength = (int)Math.Floor((double)items.Length / 2);
T[] secondPart = new T[secondLength];
Array.Copy(items, firstLength, secondPart, 0, secondLength);
return new T[][] { firstPart, secondPart };
}
如果需要第二个数组作为int[]
,可以使用以下命令:
int[] ints = Array.ConvertAll(result[1], int.Parse);
我同意你的要求听起来很奇怪,应该用不同的方法来解决。但是,这将满足您的要求:
public T[][] Bloop<T>(T[] items)
{
if (items == null) throw new ArgumentNullException("items");
if (items.Length == 1) return new T[][] { items, new T[] { } };
int firstLength = (int) Math.Ceiling((double)items.Length / 2);
T[] firstPart = new T[firstLength];
Array.Copy(items, 0, firstPart, 0, firstLength);
int secondLength = (int)Math.Floor((double)items.Length / 2);
T[] secondPart = new T[secondLength];
Array.Copy(items, firstLength, secondPart, 0, secondLength);
return new T[][] { firstPart, secondPart };
}
如果需要第二个数组作为int[]
,可以使用以下命令:
int[] ints = Array.ConvertAll(result[1], int.Parse);
Linq解决方案
您有两个组:第一个组包含可以解析为int
的项,第二个组包含所有其他项,因此GroupBy
看起来非常自然:
public Object[][] bloop(string[] bstr) {
if (null == bstr)
throw new ArgumentNullException("bstr");
int v;
return bstr
.GroupBy(x => int.TryParse(x, out v))
.OrderBy(chunk => chunk.Key) // let strings be the first
.Select(chunk => chunk.ToArray())
.ToArray();
}
测试:
Linq解决方案
您有两个组:第一个组包含可以解析为int
的项,第二个组包含所有其他项,因此GroupBy
看起来非常自然:
public Object[][] bloop(string[] bstr) {
if (null == bstr)
throw new ArgumentNullException("bstr");
int v;
return bstr
.GroupBy(x => int.TryParse(x, out v))
.OrderBy(chunk => chunk.Key) // let strings be the first
.Select(chunk => chunk.ToArray())
.ToArray();
}
测试:
下一步:向我们展示您尝试过的内容。下一步:向我们展示您尝试过的内容。似乎您使用
新对象[bstr.Length]
分配了太多的项目;这就是为什么bloop
的尾部项将是null
sYes,你是对的,我们无法预测将有多少字符串/整数,我们可以通过使用通用集合/列表和可自动递增的数组来避免这一点。似乎你用新对象[bstr.Length]
分配了太多项;这就是为什么bloop
的尾部项将是null
sYes,你是对的,我们无法预测将有多少字符串/整数,我们可以通过使用通用集合/列表和可自动递增的数组来避免这一点。