根据位置为列表中的数字指定颜色

时间:2018-04-04 19:36:17

标签: c# arrays list

所以在这里我需要一个数组,填充数字介于1到100之间。  然后他们也需要随机化。

现在我正在尝试为列表中的每个项目分配颜色,红色,黄色和白色。这是基于阵列中的位置,1 =红色,2 =黄色,3 =白色,需要在整个阵列中重复(4 =红色,5 =黄色等)

我很难找到一种方法来做到这一点。

我查看了多维数组,但我不太确定它是否会按照我需要的方式工作。我也想过,也许for循环可以达到这个目的。

或者我是否需要使用不同的枚举来为数组中的数字指定其他值。

class Program
{
    static void Main(string[] args)
    {
        int[] x = new int[101];
        Random r = new Random();

        int i;
        for (i = 0; i < x.Length; i++)
        {
            var next = 0;
            while (true)
            {
                next = r.Next(101);
                if (!Contains(x, next)) break;
            }

            x[i] = next;
            Console.WriteLine("x[{0}] = {1}", i, x[i]);
        }

        Console.ReadLine();
    }

    static bool Contains(int[] array, int value)
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i] == value) return true;
        }
        return false;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您不需要随机数生成 - 只需生成数字1到100并将它们随机播放。这比生成数百个随机数并抛出许多随机数要快得多(特别是最后你通过随机变化“抽取”许多已经存在的随机数并且不使用它们。)

我通过生成100个Guids来使用可怜的勒芒改组,使用HashCode并对生成的命令进行排序 他们的numnbers - 那个半随机的我认为。

通过生成映射每个生成的数字的字典(按顺序)解决的颜色映射 到表示为枚举值的颜色。使用我在每次赋值后调用的静态扩展方法移动当前的枚举值。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

public enum Col { Red, Yellow, White }

public static class ColExtension
{
    // Poor mans wrap around iterator for this enum: Red -> Yellow -> White -> Red ...
    public static Col Next(this Col col)
    {
        if (col == Col.Red)
            return Col.Yellow;
        if (col == Col.Yellow)
            return Col.White;
        return Col.Red;
    }
}

internal class Program
{
    public static void Main(string[] args)
    { 
        // create numbers ranging from 1 to 100. Pseudo-randomize order by ordering 
        // after randomized generated value
        var numbers = Enumerable
          .Range(1, 100).OrderBy(n => Guid.NewGuid().GetHashCode())
          .ToArray();

        // start-color for the first one
        var aktCol = Col.Red;
        var mapping = new Dictionary<int, Col>();
        foreach (var number in numbers)
        {
            // assign first color
            mapping[number] = aktCol;
            // advance color 
            aktCol = aktCol.Next(); 
        }

        foreach (var num in numbers)
            Console.WriteLine($"{num}, {mapping[num]}");

        Console.ReadLine();
    }
}

输出:

66, Red
24, Yellow
36, White
17, Red
86, Yellow
58, White
44, Red
27, Yellow
47, White
91, Red
15, Yellow
31, White
18, Red
25, Yellow
3, White
64, Red
32, Yellow
41, White
67, Red
11, Yellow
72, White
43, Red
9, Yellow
42, White
84, Red
23, Yellow
95, White
14, Red
59, Yellow
22, White
2, Red
76, Yellow
81, White
57, Red
19, Yellow
49, White
80, Red
55, Yellow
13, White
98, Red
1, Yellow
51, White
12, Red
90, Yellow
37, White
65, Red
26, Yellow
83, White
82, Red
61, Yellow
56, White
99, Red
78, Yellow
38, White
71, Red
40, Yellow
29, White
34, Red
93, Yellow
85, White
96, Red
39, Yellow
100, White
33, Red
74, Yellow
87, White
75, Red
92, Yellow
5, White
79, Red
60, Yellow
30, White
77, Red
4, Yellow
70, White
50, Red
16, Yellow
97, White
94, Red
63, Yellow
10, White
7, Red
73, Yellow
46, White
28, Red
45, Yellow
88, White
69, Red
62, Yellow
53, White
54, Red
89, Yellow
8, White
68, Red
20, Yellow
6, White
21, Red
48, Yellow
35, White
52, Red

基本上,你有一个快速查找字典的颜色取决于数字和数字的数组。我会切换到List - 但这是首选项 - 你可能有理由使用数组。

如果您想避免明确存储颜色值,您还可以使用提供值及其索引的重载来利用linq and Select来“动态”转换位置:

    // local converter function - %3 gets the rest of div by 3 so 0=red, 1=yellow,...
    // the %3 makes it wrap around and the enum parse converts it to the enum
    Col ByIndexPos(int pos) => (Col)Enum.Parse(typeof(Col), $"{pos % 3}");

    // On the fly color creation from index position:
    foreach (var anon in numbers.Select( (v, pos) => 
        new { Color = ByIndexPos(pos), Value = v })
    )
        Console.WriteLine($"{anon.Value}, {anon.Color}");

如果修改基本数组,第二种方法会改变颜色 - 所以如果你需要它们保持连接,你可以使用字典方法。

阅读了一些问题后,

编辑

如果ypu需要对数据进行后处理,你应该创建一个POCO(Struct / Classs)来保存:Number,Position,Color和以后排序/操作所需的任何其他属性以及操作这些数据的方法 - OOP to救援:)