我有一个使用List参数的构造函数。在该列表中,我有三个项目,即3个整数数组。
public HistogramLogic(List<Tuple<int[], int[], int[]>> separateRGB)
现在我想用该列表中的数组初始化三个新的整数数组。但是当我尝试这段代码时,我的新数组的索引保持为0.
for (int i = 0; i < histogramXValues.Length; i++)
{
rArray = separateRGB.Select(obj => obj.Item1[i]).ToArray();
gArray = separateRGB.Select(obj => obj.Item2[i]).ToArray();
bArray = separateRGB.Select(obj => obj.Item3[i]).ToArray();
}
有人对如何解决此问题有任何建议吗?
答案 0 :(得分:1)
您可以从touple
获取该项目rArray = separateRGB.Select(obj => obj.Item1);
答案 1 :(得分:1)
请记住,如果您有N个元组的列表,则从3 x N阵列开始。听起来你希望它们组合成3个数组,每个数组都包含整个列表中的所有元素。您可以使用SelectMany
。
rArray = separateRGB.SelectMany(obj => obj.Item1).ToArray();
gArray = separateRGB.SelectMany(obj => obj.Item2).ToArray();
bArray = separateRGB.SelectMany(obj => obj.Item3).ToArray();
完整示例:
using System;
using System.Linq;
using System.Collections.Generic;
public class Program
{
static public void HistogramLogic(List<Tuple<int[], int[], int[]>> separateRGB)
{
var rArray = separateRGB.SelectMany(obj => obj.Item1).ToArray();
var gArray = separateRGB.SelectMany(obj => obj.Item2).ToArray();
var bArray = separateRGB.SelectMany(obj => obj.Item3).ToArray();
Console.WriteLine("rArray = {}", string.Join(",", rArray));
Console.WriteLine("gArray = {}", string.Join(",", gArray));
Console.WriteLine("bArray = {}", string.Join(",", bArray));
}
public static void Main()
{
var mockData = new List<Tuple<int[], int[], int[]>>
{
Tuple.Create(new[] {11,12,13}, new[] {14,15,16}, new[] {17,18,19}),
Tuple.Create(new[] {21,22,23}, new[] {24,25,26}, new[] {27,28,29}),
Tuple.Create(new[] {31,32,33}, new[] {34,35,36}, new[] {37,38,39})
};
HistogramLogic(mockData);
}
}
输出:
rArray = {11,12,13,21,22,23,31,32,33}
gArray = {14,15,16,24,25,26,34,35,36}
bArray = {17,18,19,27,28,29,37,38,39}
答案 2 :(得分:1)
就像他们在评论中感到悲伤一样,你在每个循环中重新分配了本地成员。 你可以使用这样的东西。
public HistogramLogic(List<Tuple<int[], int[], int[]>> separateRGB)
{
List<int> rList = new List<int>();
List<int> gList = new List<int>();
List<int> bList = new List<int>();
separateRGB.ForEach((Tuple<int[], int[], int[]> tpl) =>
{
rList.AddRange(tpl.Item1);
gList.AddRange(tpl.Item1);
bList.AddRange(tpl.Item1);
});
rArray = rList.ToArray();
gArray = gList.ToArray();
bArray = bList.ToArray();
}
如果您不想使用temp List对象,您应该知道元组中元素的最终计数,将本地数组成员创建为所需的大小。并填写它。 List更适合添加和扩展元素。也许你可以使用一个Linq语句,但如果我理解目标是每个颜色得到一个int []数组。如果你采取
separateRGB.AsQueryable().Select(m => m.Item1).ToArray();
因此得到int [] []结果而不是简单的int数组;