我在游戏的每一帧都多次这样做。所以寻找一种不多次循环的方法。 谢谢你看看:))
List<Vector3> listVectors = new List<Vector3>();
for (int i = 0; i < 2000; i++) {
listVectors.Add(new Vector3(i,i,i));
}
var listX = from v in listVectors select v.x;
var listY = from v in listVectors select v.y;
var listZ = from v in listVectors select v.z;
// Is it possible to create this without looping multiple times
List<IEnumerable<float>> listV = new List<IEnumerable<float>>{listX,listY,listZ};
答案 0 :(得分:2)
List<List<float>> lists = listVectors
.SelectMany(v => new[]{
new{k = 'x', v = v.x},
new{k = 'y', v = v.y},
new{k = 'z', v = v.z}})
.GroupBy(x => x.k)
.OrderBy(g => g.Key)
.Select(g => g.Select(x => x.v).ToList())
.ToList();
答案 1 :(得分:1)
由于您要产生三种不同的结果,您需要自己编写一个循环:
List<float> listX = new List<float>(listVectors.Count);
List<float> listY = new List<float>(listVectors.Count);
List<float> listZ = new List<float>(listVectors.Count);
foreach (var vec in listVectors) {
listX.Add(vec.x);
listY.Add(vec.y);
listZ.Add(vec.z);
}
你可能会对List<T>.ForEach
产生副作用,但这也是一回事:
listVectors.ForEach(vec => {
listX.Add(vec.x);
listY.Add(vec.y);
listZ.Add(vec.z);
});
当然,最好的办法是避免完全复制。你可以通过一个简单的技巧来实现它,它传递Vector3
个对象的列表以及&#34;提取&#34;仿函数,像这样:而不是
void Process(IList<float> data) {
foreach (float f in data) {
// Do something with f
}
}
并将其称为
Process(listX);
你写了
void Process(IList<Vector3> data, Func<Vector3,float> extract) {
foreach (Vector3 v in data) {
float f = extract(v);
// Do something with f
}
}
并致电
Process(listVectors, v => v.x);