【问题标题】:List with arrays into seperate arrays将数组列出到单独的数组中
【发布时间】:2018-04-29 04:48:44
【问题描述】:

我有一个使用 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”是什么意思。你的意思是Count
  • @johnWu 我的意思是新数组的长度
  • 您的循环会反复将值重新分配给rArraygArraybArray,从而覆盖以前的值。
  • 另外separateRGB 的声明似乎有点不寻常,我希望List&lt;Tuple&lt;int, int, int&gt;&gt;Tuple&lt;int[], int[], int[]&gt; 用于颜色列表,但您可能有一个颜色列表列表,并且您是否正在尝试有效地将第二个索引中的值提取到数组中?
  • @kajacx 这绝对是一个用多个整数数组填充的 List。我的目的是从随机选择的图片中绘制单独的 R、G、B 值的直方图。因此,我遍历每个像素,在该像素内选择单独的 R、G 和 B 值。 IF 语句(在 for 循环内)将检查 R、G 和 B 值是否等于我的 X 轴值之一(0-255)。如果是这样,它将增加+1。完成所有像素后。我将在列表中设置 R、G 和 B 的 Y 轴增量值(作为单独的 int 数组)并将其传递给我的绘图类。

标签: c# arrays list int


【解决方案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 = {{{0}}}", string.Join(",", rArray));
        Console.WriteLine("gArray = {{{0}}}", string.Join(",", gArray));
        Console.WriteLine("bArray = {{{0}}}", 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}

Click here for code on DotNetFiddle

【讨论】:

  • 为什么在这里需要SelectMany()
  • 因为 List 中的每一项都有一个数组。这会将它们组合成一个大数组。
  • @JohnWu 谢谢!这帮助了我!像魅力一样工作!
【解决方案2】:

你可以从 touple 获取项目

rArray = separateRGB.Select(obj => obj.Item1);

【讨论】:

  • 这是我的初始代码,但给了我一个错误。不过我的问题已经解决了!但感谢您的时间和帮助!
【解决方案3】:

就像他们在 cmets 中感到难过一样,您确实在每个循环中重新分配了本地成员。 你可以使用这样的东西。

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();

}

如果您不想使用临时列表对象,您应该知道元组中元素的最终计数,创建所需大小的本地数组成员。并填充它。 List 更适合添加和扩展元素。也许您可以使用一个 Linq 语句,但如果我理解目标是为每种颜色获取一个 int[] 数组。如果你采取

separateRGB.AsQueryable().Select(m => m.Item1).ToArray();

结果你得到 int[][] 结果而不是简单的 int 数组;

【讨论】:

  • 我使用 JohnWu 的代码修复了它。感谢您的帮助和时间!非常感谢!
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 2011-01-26
  • 2020-03-25
  • 2021-08-16
  • 2020-02-16
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多