我有2个不同长度的数组列表,我希望检索数据并按所需顺序排列。我的编码如下:
ArrayList Alist = new ArrayList();
ArrayList Blist = new ArrayList();
Alist.Add(10);
Alist.Add(20);
Alist.Add(30);
Blist.Add("Y");
Blist.Add("Z");
string Result = string.Empty;
for (int i = 0; i < Alist.Count; i++)
{
Result += Alist[i];
for (int j = 0; j < Blist.Count; j++)
{
Result += Blist[j];
break;
}
Console.WriteLine(Result);
Console.ReadLine();
}
我想要的输出应该是
10Y20Z30
,但这个程序正在提供输出
10Y20Y30Y
同时,检测到无法访问的代码,即int j
希望有人能纠正我
感谢。
答案 0 :(得分:2)
//....
var j = 0;
for (int i = 0; i < Alist.Count; i++)
{
Result += Alist[i];
if (j < Blist.Count)
Result += Blist[j++];
}
while (j < Blist.Count) //in case B length> A length
Result += Blist[j++];
Console.WriteLine(Result);
Console.ReadLine();
//....
答案 1 :(得分:0)
您可以使用相同的for
循环,只使用较小的大小作为终止条件,即计算两种尺寸的min
。
// define objects
ArrayList Alist = new ArrayList();
ArrayList Blist = new ArrayList();
// add elements
Alist.Add(10);
Alist.Add(20);
Alist.Add(30);
Blist.Add("Y");
Blist.Add("Z");
//
string Result = string.Empty;
// accumulate result as: ABABABA with size = 2 * (size of smaller)
int min = Math.Min(Alist.Count, Blist.Count);
var j = 0;
for (int i = 0; i < min; i++)
{
Result += Alist[i];
Result += Blist[i];
j = i;
}
// as A always > B then (as OP said),
// increment and concatenate the next element of array list A
++j;
Result += Alist[j];
// display result
Console.WriteLine(Result);
Console.ReadLine();
输出:
10Y20Z30
答案 2 :(得分:0)
代码中的问题是 Alist
中的每个元素都会在Blist
上启动一个新循环,但在第一个元素之后立即中断该循环。这解释了您的结果和“无法访问的代码”警告。
要获得所需的结果,您可以执行以下操作:
Result = string.Join(string.Empty, Alist.OfType<int>()
.Select(
(i, index) => i.ToString() + (index < Blist.Count ? Blist[index].ToString() : string.Empty)));
这将Alist
中的所有元素与同一索引处的“Blist”中的元素组合在一起。
如果Blist
中有更多元素,您可以在最后添加:
Result += string.Join(string.Empty, Blist.OfType<string>().Skip(Alist.Count));
答案 3 :(得分:0)
所以你只需要一个循环,但如果你有不同大小的数组它会有一点风险。现在你为每个Alist值循环整个Blist,我不认为这是你想要的。解决问题的一种非常天真的方式是这样的:
for(int i = 0; i < Alist.Count; i++) {
Result+= Alist[i];
Result+= Blist[i];
}
但是你会遇到问题,A有3个元素而B只有2个.B [2]将返回ArgumentOutOfRangeException。因此,请确保您不会遇到这个问题:
for(int i = 0; i < Alist.Count; i++) {
Result+= Alist[i];
if(i < Blist.Count) {
Result+= Blist[i];
}
}
这应该正确组合列表。如果你不确定哪个列表更大,你可以在循环之前做一点逻辑,以确保它正确组合。
ArrayList longerList = (Alist.Count >= Blist.Count) ? Alist : Blist;
ArrayList shorterList = (Alist.Count >= Blist.Count) ? Blist : Alist;
for (int i = 0; i < longerList.Count; i++) {
Result += longerList[i];
if (i < shorterList.Count) {
Result += shorterList[i];
}
}
答案 4 :(得分:0)
//...
StringBuilder strBuilder = new StringBuilder();
var max = Math.Max(Alist.Count, Blist.Count);
for (int i = 0; i < max; ++i)
{
if (Alist.Count > i)
strBuilder.Append(Alist[i]);
if (Blist.Count > i)
strBuilder.Append(Blist[i]);
}
var result = strBuilder.ToString();
Console.WriteLine(result);