使用foreach循环为c#中的两个列表获取列表值

时间:2012-07-10 09:43:27

标签: c# list loops foreach

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };

for(int i = 0; i < listA.Count; i++)
{
    text += listA[i] + " and " + listB[i];
}

如何使用foreach循环执行此操作?

7 个答案:

答案 0 :(得分:12)

您可以使用Linq和Zip方法:

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };

foreach (var pair in listA.Zip(listB, (a,b) => new {A = a, B = b}))
{
    text += pair.A + " and " + pair.B;
}

答案 1 :(得分:4)

你不能使用foreach做得比使用for做得更好 - foreach实际上只有在只有一个要枚举的序列时才能正常工作

但是,您可以使用LINQ非常方便地完成:

text = string.Join("", listA.Zip(listB, (a, b) => a + " and " + b));

这需要.NET 4同时适用于Zipspecific overload of string.Join

答案 2 :(得分:4)

另一种方法是使用简单的Enumerator:

IEnumerator<string>  enumerator = listB.GetEnumerator(); 
enumerator.MoveNext();
foreach(var stra in listA) {
    text += stra + " and " + enumerator.Current.ToString() + ", ";
    enumerator.MoveNext();
}

答案 3 :(得分:1)

使用LINQ

string text = listA.Zip(listB, (a, b) => new {A = a, B = b}).Aggregate("", (current, pair) => current + (pair.A + " and " + pair.B));

答案 4 :(得分:1)

如果您不想使用LINQ并且希望它们并行迭代,那么您可以选择几个选项 - 如下所示使用新类等,或者您可以使用 foreach ,但仅限于其中一个列表,像这样:

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };
string text = "";
int i = 0;
foreach (string s in listA) {
   text += s + " and " + listB [i++] + "\n";
}
Console.WriteLine (text);

或使用GetEnumerator使其更好一点:

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };
string text = "";       
List<string>.Enumerator e = listB.GetEnumerator ();
foreach (string s in listA) {
   e.MoveNext ();
   text += s + " and " + e.Current + "\n";
}
Console.WriteLine (text);

你也可以创建一个Enumberable metacollection,它将返回总是一个简单的字符串数组 - 为此你需要创建一个Enumerator和一个来自IEnumerable的类:

首先是枚举器:

private class DoubleStringEnumerator : IEnumerator
{
    private DoubleString _elemList;
    private int _index;
    public DoubleStringEnumerator(DoubleString doubleStringObjt)
    {
        _elemList = doubleStringObjt;
        _index = -1;
    }
    public void Reset()
    {
        _index = -1;
    }
    public object Current {
        get {
            return _elemList.getNext();
        }
    }
    public bool MoveNext ()
    {
        _index++;
        if (_index >= _elemList.Length)
            return false;
        else
            return true;
    }
}

当前方法并没有真正反映出给定示例中的名称 - 但它是出于学习目的。

现在上课:

public class DoubleString : IEnumerable
{
    public int Length;
    List<String> listA;
    List<String> listB;
    List<string>.Enumerator eA,eB;
    public DoubleString(List<String> newA,List<String> newB)
    {
        if(newA.Count != newB.Count) {
            throw new Exception("Lists lengths must be the same");    
        }
        listA = newA;
        listB = newB;
        eA = listA.GetEnumerator ();
        eB = listB.GetEnumerator ();
        Length = listA.Count;
    }
    IEnumerator IEnumerable.GetEnumerator ()
    {
        return (IEnumerator)new DoubleStringEnumerator(this);
    }
    public string[] getNext ()
    {
        eA.MoveNext ();
        eB.MoveNext ();
        return new string[] {eA.Current ,eB.Current };
    }
}

代码本身:

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };               
DoubleString newDoubleString = new DoubleString (listA, listB);             
string text = "";
foreach (string[] s in newDoubleString) {
    text += s[0] + " and " + s[1] + "\n";
}
Console.WriteLine (text);

当然最好还是使用LINQ。代码没有被激活,但我没有编译器,所以写下我的头 - 希望它能澄清一些事情。随意提问。

答案 5 :(得分:-2)

List<int> = new [] { 1, 2, 3, 4 };
List<String> words = new [] { "one", "two", "three" };

var numbersAndWords = numbers.Zip(words, (n, w) => new { Number = n, Word = w });
foreach(var nw in numbersAndWords)
{
    Console.WriteLine(nw.Number + nw.Word);
}

答案 6 :(得分:-3)

以下是使用foreach的解决方案:

string text = null;
int cnt = 0;

List<String> listA = new List<string> { "A1", "A2" };
List<String> listB = new List<string> { "B1", "B2" };

foreach (string i in listA)
  {
         text += listA[cnt] + " and " + listB[cnt];
         cnt++;
  }

谢谢&amp;问候,
Subhankar