如何在数组列表中获取第一个,第二个......两个字符串列表的值?

时间:2017-02-11 21:29:20

标签: c# arraylist

我在按照我想要的顺序检索值时遇到问题 我写了一个简单的代码来演示:

List<string> st1 = new List<string>() {"st11","st12"};
List<string> st2 = new List<string>() {"st21","st22"};
ArrayList stringArrayList = new ArrayList();
stringArrayList.Add(st1);
stringArrayList.Add(st2);

string[] n1 = new string[10];
int i = 0;
foreach (List<string> item in stringArrayList)
{
    foreach (var item2 in item)
    {
        n1[i] = item2;
        i++;
    }
}

在此代码中输出将为:st11,st12 st21,s22

我想让它得到这样的值:st11,st21 st12,st22

我希望按此顺序存储信息&#34; st11,st21 st12,st22&#34;进入n1

4 个答案:

答案 0 :(得分:3)

如果列表的长度相同,你可以这样做:

int j = 0;
int lengthToLoop = st1.length;
for(int i = 0; i < lengthToLoop; i++)
{
   n1[j++] = st1[i];
   n1[j++] = st2[i];
}

如果长度不相等,您可以计算最小值,复制每个元素的最小长度,然后复制剩余的。

答案 1 :(得分:2)

这是一个可以执行您正在寻找的实现,并且还将处理锯齿状数组。

List<string> st1 = new List<string>() { "st11", "st12" };
List<string> st2 = new List<string>() { "st21", "st22",  };
ArrayList stringArrayList = new ArrayList();
stringArrayList.Add(st1);
stringArrayList.Add(st2);

//this will protect us against differing max indexes if the 2D array is jagged. 
int maxIndex = 0;
int totalElements = 0; 
foreach (List<string> currentList in stringArrayList)
{
    if (currentList.Count > maxIndex)
    {
        maxIndex = currentList.Count; 
    }
    totalElements += currentList.Count; 
 }

 string[] n1 = new string[totalElements];
 int i = 0;
 for (int j = 0; j < maxIndex; j++)
 {
     for (int k = 0; k < stringArrayList.Count; k++)
     {
         List<string> currentStringArray = (List<string>)stringArrayList[k];
         if (j < currentStringArray.Count)
         {
             n1[i] = currentStringArray[j];
             i++;
         }

     }
 }

答案 2 :(得分:1)

首先,检查最大列表长度,然后从每个列表中获取索引(0,1,3 ...到最大值)的项目。不要忘记检查索引是否存在。此外,您可以设置n1的确切大小,因为它是所有列表计数的总和。在这种情况下,您不需要为i++分隔一行。

        List<string> st1 = new List<string> { "st11", "st12" };
        List<string> st2 = new List<string> { "st21", "st22" };
        List<List<string>> stringArrayList = new List<List<string>> {st1, st2};
        int maxCount = stringArrayList.Max(x => x.Count);
        int totalItems = 0;
        stringArrayList.ForEach(x=> totalItems+= x.Count);
        string[] n1 = new string[totalItems];
        int i = 0;

        for (int index = 0; index < maxCount; index++)
        {
            foreach (var list in stringArrayList)
            {
                if (list.Count > index)
                {
                    n1[i++] = list[index];                     
                }
            }
        }

答案 3 :(得分:1)

你必须反转两个循环,使外循环成为内循环。

使用for循环代替foreach循环作为外部循环,使用字符串数组的长度作为分隔符。

另外:不要使用ArrayList,而是使用真正的类型列表。

List<string> st1 = new List<string>() { "st11", "st12" };
List<string> st2 = new List<string>() { "st21", "st22" };

List<List<string>> stringArrayList = new List<List<string>>();
stringArrayList.Add(st1);
stringArrayList.Add(st2);

// Get length of first string array
int firstArrayLength = stringArrayList[0].Count;

string[] n1 = new string[10];
int i = 0;

// For each position in the arrays from 0 to firstArrayLength -1 do
for (int arrayPosition = 0; arrayPosition < firstArrayLength; arrayPosition++)
{
    // For each of the string array
    foreach (var stringArray in stringArrayList)
    {
        // Get the item from the stringArray at position arrayPosition
        n1[i] = stringArray[arrayPosition];
        i++;
    }
}