1

我有一个从类返回的数据集合,如下所示

item[0].value, item[1].value, item[2].value

我想value根据值将其放入三个单独的数组中。

例子:

item[0].value = red
item[1].value = blue
item[2].value = green
item[3].value = red
item[4].value = red
item[5].value = blue

Array red = { item[0], item[3], item[4] }
Array blue = { item[1], item[5] }
Array green = { item[2] }

我如何在 C# 中做到这一点?

已编辑(我是 C# 的新手,所以我真的不知道如何表示它们,对不起,伙计们)

我收到的正确收藏应该如下所示

item.value[0].color = red
item.value[0].color = blue
item.value[0].color = green
item.value[0].color = red
item.value[0].color = red
item.value[0].color = blue

item.value[x]我想根据其color价值对上述内容进行分组。

喜欢:

Group Red will have item.value[0], item.value[3], item.value[4]
Group blue will have item.value[1], item.value[5]

等等。

实验:

int[] colors = { item.value[0].value, item.value[1].value, item.value[2].value };

int[] Red = colors.Where(c => c == "Red").ToArray();

这将返回 aRed Array但不item.value[0]返回红色。我希望红色阵列具有各自的item.value[x]红色。

4

5 回答 5

3

LINQ 应该可以解决问题:

var groups = item.GroupBy(x => x).Select(color => color.ToList()).ToList();

它将返回以下内容:
在此处输入图像描述

于 2013-11-09T19:08:48.800 回答
1

你可以使用 Linq 很容易地做到这一点

List<Color> colors = new List<Color>{Color.Red, Color.Red, Color.Blue, Colour.Green};
Color[] red = colors.Where(c => c == Color.Red).ToArray();
Color[] blue = colors.Where(c => c == Color.Blue).ToArray();
Color[] green = colors.Where(c => c == Color.Green).ToArray();

即使您的数据结构是Array,Linq 仍然是相同的。

这是 MSDN 文档Where()

可枚举.Where

于 2013-11-09T19:06:59.567 回答
1

您的语法在几个地方是错误的。您不需要.Value分配给数组..并且您忘记了字符串周围的引号。

像这样做。

        string[] item = new string[6];
        item[0] = "red";
        item[1] = "blue";
        item[2]= "green";
        item[3] = "red";
        item[4]= "red";
        item[5] = "blue";

您可以使用 linq 创建新数组

 string[] redArray = item.Where(c => c == "red").ToArray();

如果item不是字符串并且具有.Value属性,那么您的 linq 将是

item[] redArray = item.Where(c => c.Value == "red").ToArray();

根据你的实验考虑这个

int[] colors = { item.value[0], item.value[1], item.value[2] };

var Red = colors.Where(c => c.value == "Red").ToArray();

原始数据类型的数组在哪里Red,而不仅仅是红色的数组。

于 2013-11-09T19:11:35.027 回答
1

只需为颜色定义一个枚举并使用 linq 查询就可以做到这一点。

        private void button1_Click(object sender, EventArgs e)
        {
            List<Color> item = new List<Color>();

            item.Add(Color.blue);
            item.Add(Color.red);
            item.Add(Color.blue);
            item.Add(Color.red);
            item.Add(Color.red);
            item.Add(Color.green);

            List<Color> red = item.Where(x => x.Equals(Color.red)).ToList();
            List<Color> blue = item.Where(x => x.Equals(Color.blue)).ToList();
            List<Color> green = item.Where(x => x.Equals(Color.green)).ToList();
        }
        enum Color
        {
           red,
           blue,
           green
        }
于 2013-11-09T20:33:26.670 回答
0

您在评论中提到可能只有 10 个项目,每个项目itemvalue介于[0-11] inclusive. 你还说这color件事实际上是一个误导,它们实际上integers不是物理颜色。

只有 10 个项目需要分析和分类,你走哪条路并不重要。即使是 10 个if-elseif-else梯子也可以表现得很好,但可能看起来并不漂亮。

对于item数组中的大量元素,以及纯粹的学术兴趣,这里的最佳方法是称为Radix Sort的方法。请查一下。以下伪代码将为您提供帮助。

INPUT:    items   AS ARRAY[9]      

DECLARE:  colors  AS ARRAY[12]       //will hold final results for each color

FOR(i = 0 UPTO 11)
    colors[i] = NEW ARRAYLIST        //will hold the final result for color no. i

FOR(j = 0 UPTO items.length)
    itm = items[j]
    colr = itm.value                 //take the color, should be between 0-11
    bucket = colors[colr]            //bucket is the arraylist coresponding to color
    bucket.add(itm)                  //store the item in its color's bucket

循环完成后,您将获得colors数组中的项目。请注意,数组的每个单元格ArrayList本身就是一个。因此它将包含一个序列items

colors[0]  = { item[0], item[6], ...}
colors[1]  = { item[4], item[9], ...}
colors[2]  = { item[7], ...}
  ...
  ...
colors[11] = {...}

尝试用 C# 翻译它。问你是否失败。

于 2013-11-10T05:40:56.003 回答