3个数组到1个IEnumerable <test> </test>

时间:2011-04-05 07:37:47

标签: c# linq

让我说我有这个:

 public class test
 {
     int foo;
     int foo2;
     string foo3;
 }

 int[] foo = new int[] { 1, 2, 3 };
 int[] foo2 = new int[] { 4, 5, 6 };
 string[] foo3 = new string[] { "a", "b", "c" };

如何将这3个数组转换为IEnumberable of test?

TIA

/拉塞

3 个答案:

答案 0 :(得分:8)

您可以使用.NET 4.0 Enumerable.Zip扩展方法:

foo.Zip(foo2, (first, second) => new { first, second })
    .Zip(foo3, (left, right) => new test
    {
        foo = left.first, 
        foo2 = left.second, 
        foo3 = right
    });

或者写一个执行此操作的方法:

public static IEnumerable<test> FooCombiner(int[] foo,
    int[] foo2, string[] foo3)
{
    for (int index = 0; index < foo.Length; index++)
    {
        yield return new test
        {
            foo = foo[index], 
            foo2 = foo2[index], 
            foo3 = foo3[index]
        };
    }
}

最后一个例子是最易读的IMO。

答案 1 :(得分:5)

public static IEnumerable<test> Test(int[] foo, int[] foo2, string[] foo3)
{
    // do some length checking
    for (int i = 0; i < foo.Length; i++)
    {
        yield return new test()
        {
            foo = foo[i],
            foo2 = foo2[i],
            foo3 = foo3[i]
        };
    }
}

您可以添加一些长度检查或使用foreach进行,但我认为想法已经显示

答案 2 :(得分:2)

如果您不喜欢循环,可以使用此代码:

List<test> result = Enumerable.Range(0, foo.Length).Select(i => new test() { foo = foo[i], foo2 = foo2[i], foo3 = foo3[i] }).ToList();