2014-07-08 98 views
2

說我有一個類或定義爲這樣一個結構:陣列中的陣列

public class foo 
{ 
    public int x; 
    public int y; 
} 

or 

public struct bar 
{ 
    public int x; 
    public int y; 
} 

說我有一些陣列或對象的列表中,任一或foo'sbar's陣列。現在我想創建一個數組或x和/或y的列表。是否有一種簡單的方法可以在C#中執行此操作,而不需要遍歷數組的每個foobar,然後將所需的成員變量添加到另一個數組中?

例如,這是我當前如何做它:

//For some List<foo> fooList 
//get the x's and store them to the array List<int> xList 

foreach (var fooAtom in fooList) 
{ 
    xList.Add(fooAtom.x); 
} 

是否有這樣做的更快/更小的編碼方式是什麼? C#中是否有專門爲此設計的構造?類與結構不同嗎?謝謝。

+2

可以使用LINQ。 'var allMyXs = fooList.Select(f => f.x)' –

+0

@Asad謝謝,那正是我在尋找的 – Iowa15

+0

那麼LINQ解決方案很漂亮,但要注意性能。 Select不會比你當前的循環更快,並且如果fooList很大....(並且順便說它仍然是一個循環) – Steve

回答

3

你可以使用LINQ查詢:

Int32[] xArray = fooList.Select(fooItem => fooItem.x).ToArray(); 

這LINQ查詢工作會以同樣的方式對類和結構兩者。但是在某些情況下,結構值可能是boxed,它們將會多次爲copied(它們是結尾的結構 - 按值傳遞) - 所有這些都會導致對其進行多個LINQ操作的大型結構的可能開銷。

還要考慮到LINQ不是every possible situation的工具。有時,簡單的forwhile)循環將更具可讀性並且會提供更高的性能。

+0

感謝這是我正在尋找! – Iowa15

+0

閱讀http://stackoverflow.com/questions/11344019/linq-and-lambda-expression和http://msdn.microsoft.com/en-us/library/bb397687.aspx。簡而言之:列表中的每個項目都將被表示爲'fooItem',並且從這個'fooItem'中的每個項目都將採用'.x'字段,並且所有這些x字段將統一在一個數組中。 –

+2

這根本不涉及拳擊。它*複製*他們,這是完全不同的。 (還有OP特別表示他不想做的事情。) – Servy

1

如果他們有共同的東西,你也可以創建一個itnerface

public interface IFooBarable 
{ 
    int x; 
    int y; 
} 

,然後您的收藏也只是一個List<IFooBarable>中,你可以把你既FooBar對象,他們可以訪問同樣的方式。

1

我會做一個基類或具有x和y屬性的接口。這樣可以讓更多的靈活性,在遍歷集合:

public interface IHasXY { int x { get; } int y { get; } } 

public class Foo : IHasXY { public int x { get; set; } public int y { get; set; } } 
public struct Bar : IHasXY { public int x { get; set; } public int y { get; set; } } 

話,甚至可以CONCAT foo和酒吧集合:

var allXs = fooList.Concat(barList).Select(o => o.x).ToArray();