如何比较多维字符串数组?

use*_*901 2 c# arrays string multidimensional-array

我想比较2个字段.即机器和通行证.

我想连接'Color'取决于Machine和pass的值.

--------------|------------------|------------
 Color1       | Machine 1        | Pass 1 
--------------|------------------|------------
 Color2       | Machine 2        | Pass 1 
--------------|------------------|------------
 Color3       | Machine 1        | Pass 1 
--------------|------------------|------------
 Color4       | Machine 1        | Pass 2 
--------------|------------------|------------
 Color5       | Machine 2        | Pass 1 
--------------|------------------|------------
 Color6       | Machine 2        | Pass 2 
--------------|------------------|------------
Run Code Online (Sandbox Code Playgroud)

我想要的结果如下.

  1. Machine1和Pass1的Color1/Color3
  2. Machine2和Pass2的Color2/Color5
  3. Machine1和Pass2的Color4
  4. Machine2和Pass2的Color6

我不知道如何得到这个结果.尝试了许多方法,但没有按照我想要的方式得到它

Ser*_*rvy 6

首先,从概念上讲,你真正拥有的是复杂对象的单个维度,它具有颜色,机器和传递值.将其存储在二维数组中并不是一个好主意.更好的表示是一种List自定义类型,所以让我们先做转换.

首先,我们将定义一个自定义类型来表示输入数据:

public class MachinePass//TODO consider renaming
{
    public string Color { get; set; }
    public string Machine { get; set; }
    public string Pass { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我们将解析我们的输入并将其放入适当的结构中:

var list = new List<MachinePass>();
for (int i = 0; i < data.GetLength(0); i++)
{
    var next = new MachinePass();
    next.Color = data[i, 0];
    next.Machine = data[i, 1];
    next.Pass = data[i, 2];
    list.Add(next);
}
Run Code Online (Sandbox Code Playgroud)

现在我们有了这个,我们可以应用我们的业务逻辑.在这种情况下,您要做的是通过机器和传递对这些行进行分组,然后获取这些组的颜色.在GroupByLINQ操作使这个超级简单:

var query = list.GroupBy(row => new { row.Machine, row.Pass }
    , row => row.Color);
Run Code Online (Sandbox Code Playgroud)

然后我们可以用定义的格式打印出这个查询的结果:

foreach(var group in query)
    Console.WriteLine("{0} for {1} & {2}",
        string.Join("/", group),
        group.Key.Machine,
        group.Key.Pass);
Run Code Online (Sandbox Code Playgroud)