C#如何从2个不同长度的数组列表中检索数据?

时间:2016-08-16 15:30:28

标签: c#

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

5 个答案:

答案 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);