2011-04-05 44 views
1

可以說我有這樣的:3陣列1 IEnumerable的<test>

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測試?

TIA

/拉塞

+2

也許使用一個for循環?使用產量的 – 2011-04-05 07:41:53

回答

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。

+0

也使它相當優雅。所以它是最具可讀性的後者。 – 2011-04-05 07:53:00

+0

也比較喜歡最後一個例子。在生產代碼中,應該使用一些代碼驗證所有數組的長度是否相同。 – 2011-04-05 08:03:00

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

您可以使用此代碼,如果你不喜歡的循環:

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

我得到像索引0的3,不知何故所有的值都是[0] – 2011-04-05 11:17:08

+0

你做錯了,嘗試複製粘貼確切的代碼。也許在索引中忘記'我':foo2 [i] – Poma 2011-04-05 11:31:35

+0

是MVC Html.Textbox助手,它與我混淆,只在循環中顯示第一個。問題解決了 – 2011-04-05 11:41:09

相關問題