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希望有人能纠正我谢谢。

c#如何从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();
  //....

代码中的问题是,对于 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