想弄清楚这个问题有很多麻烦,并感谢任何提示(LINQ可能?)
我有一个来自CSV字符串列表的数据结构
data[i].X = Convert.ToSingle(dataList[0]);
data[i].Y = Convert.ToSingle(dataList[1]);
data[i].Z = Convert.ToSingle(dataList[2]);
数据来自一张图像,因此每个X都有许多Y(带有相应的Z),例如:
X: 0 0 1 1 2 2
Y: 0 1 0 1 0 1
Z: 1 2 3 2 1 0
我需要找到与不同的X匹配的所有Z值(其中Y将在某些值之间)。我已经将数据结构转换为双数组来进行一些数学运算,所以我尝试了
distData[0] = distTemp[0].Distinct().ToArray();
for (int i = 0; i < data.Length; i++)
{
for (int j = 0; j < distData.Length; j++)
{
if (data[i].Y > 0 && data[i].Y < 2 && data[i].X == dist[0][j])
dist[0][i] = data[i].Z;
}
}
这个工作,但现在我没有最模糊的概念如何与我给出的数据工作。我返回了我应该期望的,这是一个巨大的数组(data.Length),它有一些0值,然后是一组Z值(当条件满足时),然后是0,等等。
0 0 0 0 Z Z Z Z Z 0 0 0 Z Z Z Z 0 0 0 0 0 Z Z...
接下来我需要做的是对非零数据进行分组,所以对于上面我想要"平均第一组Z,忽略下一个0,平均下一组Z…",所以我最终得到了满足Y值条件的每个唯一X值的Z平均值(和其他计算)。
我不知道如何做那个逻辑,似乎从我在我的数据结构上使用的非常基本的LINQ(我是非常新的LINQ),可能有一个比很多数组迭代更好的方法-假设我甚至可以找出迭代逻辑。
谢谢
如果您不想从n
可用值中收集n
,那么使用大小为n
的数组并仅填充您想要收集的值似乎是一个坏主意。因为这正是你对dist[0]
所做的:每个应该被收集的Z
被设置为它在dist[0][i]
的索引;对于所有其他Z
,您不更改数组值。
相反,您应该只收集您感兴趣的值:
var values = new List<int>();
for (int i = 0; i < data.Length; i++)
{
if (condition(data[i].Y))
values.Add(data[i].Z);
}
之后,values
将包含Y
条件成功的所有Z
。当然,这会极大地改变结果数据结构的外观,远离输入数据结构,但这就是您应该做的:获取输入数据并以您需要的方式对其进行转换。
然后,用LINQ表示也很简单:
var values = data.Where(d => condition(d.Y))
.Select(d => d.Z)
.ToList();