假设我有一个类或结构定义如下:
public class foo
{
public int x;
public int y;
}
or
public struct bar
{
public int x;
public int y;
}
假设我有一些数组或对象列表,可以是foo's
或bar's
的数组。现在我想创建一个x和/或y的数组或列表。有没有一种简单的方法在C#中执行此操作,不需要遍历数组的每个foo
或bar
,然后将所需的成员变量添加到另一个数组?
例如,这就是我目前的做法:
//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#中是否有专门为此设计的构造?类和结构是不同的?感谢。
答案 0 :(得分:3)
您可以使用LINQ查询:
Int32[] xArray = fooList.Select(fooItem => fooItem.x).ToArray();
对于类和结构,此LINQ查询将以相同的方式工作。但是在某些情况下,struct值可以是boxed,它们将多次copied(它们是结尾的结构 - 通过值传递) - 这些都会导致具有多个LINQ操作的大型结构的可能开销在他们身上。
还要考虑到LINQ不是every possible situation的工具。有时普通for
(while
)循环将更具可读性,并将提供更高的性能。
答案 1 :(得分:1)
如果他们有共同点,你也可以创建一个itnerface
public interface IFooBarable
{
int x;
int y;
}
然后您的收藏只是一个List<IFooBarable>
,您可以在其中保存Foo
和Bar
个对象,并且可以同样方式访问它们。
答案 2 :(得分: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; } }
然后你甚至可以连接foo和bar集合:
var allXs = fooList.Concat(barList).Select(o => o.x).ToArray();