c#如何从2个不同长度的数组列表中检索数据
本文关键字:数组 列表 数据 检索 2个 | 更新日期: 2023-09-27 18:02:41
我有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();
}
我期望的输出应该是
10 y20z30
,但是这个程序给出的输出是
10 y20y30y
同时检测到不可达代码int j
希望有人能纠正我谢谢。
//....
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();
//....
代码中的问题是,对于 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));
所以你只需要一个循环,尽管如果你有不同大小的数组,这有点冒险。现在你要循环遍历整个Blist的每个list值,我认为这不是你想要的。处理这个问题的一种非常简单的方法是这样的:
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];
}
}
//...
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);
您可以使用相同的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();
输出:10 y20z30