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

C# 如何比较多维字符串数组?,c#,arrays,string,multidimensional-array,C#,Arrays,String,Multidimensional Array,我想比较两个字段。i、 换台机器并通过 我想根据Machine和pass的值连接“Color” --------------|------------------|------------ Color1 | Machine 1 | Pass 1 --------------|------------------|------------ Color2 | Machine 2 | Pass 1 --------------|-------

我想比较两个字段。i、 换台机器并通过

我想根据Machine和pass的值连接“Color”

--------------|------------------|------------
 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 
--------------|------------------|------------
我希望结果如下

  • 机器1和通道1的颜色1/3
  • 机器2和通道2的颜色2/5
  • 机器1和通道2的颜色4
  • 机器2和通道2的颜色6
  • 我不知道如何得到这个结果。尝试了很多方法,但没有按照我想要的方式得到它

    这是你的答案

    private void button1_Click(object sender, EventArgs e)
    {
        var ary = new[]
        {
            "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 "
        };
    
        var seprated = from x in ary.Select(x => x.Split('|'))
                        select new
                        {
                            key = x[1].Trim() + "&" + x[2].Trim(),
                            value = x[0]
                        };
    
        var sb = new StringBuilder();
        foreach (var key in seprated.Select(x => x.key).Distinct())
        {
            var colors = seprated.Where(x => x.key == key).Select(x => x.value.Trim()).ToArray();
            sb.AppendLine(string.Format("{0} for {1}", string.Join("/", colors), key));
        }
    
        textBox1.Text = sb.ToString();
    }
    
    sb.toString()具有以下结果:

    机器1和通道1的颜色1/3

    机器2和通道1的颜色2/5

    机器1和通道2的颜色4

    机器2和过程2的颜色6
            var multidimensionalArray = new[,]
                {
                    {"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"}
                };
    
            var tuple = new List<Tuple<string, string, string>>();
            for (var i = 0; i < multidimensionalArray.Length/3-1; i++)
            {
                tuple.Add(new Tuple<string, string, string>(multidimensionalArray[i, 0], multidimensionalArray[i, 1], multidimensionalArray[i, 2]));
            }
    
            foreach (var el in tuple.GroupBy(x => String.Format("{0} & {1}", x.Item2, x.Item3), y => y.Item1))
            {
                Console.WriteLine(String.Join("/", el) + " for " + el.Key);
            }
    
    { {“Color1”、“Machine 1”、“Pass 1”}, {“Color2”,“machine2”,“pass1”}, {“Color3”,“Machine 1”,“Pass 1”}, {“Color4”,“Machine 1”,“Pass 2”}, {“Color5”、“Machine 2”、“Pass 1”}, {“Color6”、“机器2”、“通过2”} }; var tuple=新列表(); 对于(变量i=0;iString.Format(“{0}&{1}”,x.Item2,x.Item3),y=>y.Item1)中的变量el) { Console.WriteLine(String.Join(“/”,el)+表示“+el.Key”); }
    您没有提供类定义,因此我假设它是以下内容

    class PaintMachineInfo
    {
        public string ColorName {get; set;}
        public string MachineName {get; set;}
        public string Pass {get; set;}
    }
    
    通过使用,您可以很容易地获得所需的结果,它允许您提供一个键,并提供与该键匹配的IEnumerable结果

    我喜欢使用自定义类作为查找键,而不是使用
    元组
    ,因为它使您看到的内容更加明显,并且创建类的代码也不太多

    private static void Main(string[] args)
    {
        List<PaintMachineInfo> info = GenerateInfo();
    
        var filteredResults = info.ToLookup(line => new PaintMachineLookup(line.MachineName, line.Pass), line => line.ColorName);
    
        //Contains a IEnumerable<string> containing the elements "Color1" and "Color3"
        var result1 = filteredResults[new PaintMachineLookup("Machine 1", "Pass 1")];
    
    }
    
    private static List<PaintMachineInfo> GenerateInfo()
    {
        //...
    }
    
    class PaintMachineInfo
    {
        public string ColorName { get; set; }
        public string MachineName { get; set; }
        public string Pass { get; set; }
    }
    
    internal class PaintMachineLookup
    {
        public PaintMachineLookup(string machineName, string pass)
        {
            MachineName = machineName;
            Pass = pass;
        }
        public string MachineName { get; private set; }
        public string Pass { get; private set; }
    
        public override int GetHashCode()
        {
            unchecked
            {
                int x = 27;
                x = x * 11 + MachineName.GetHashCode();
                x = x * 11 + Pass.GetHashCode();
                return x;
            }
        }
    
        public override bool Equals(object obj)
        {
            var other = obj as PaintMachineLookup;
            if (other == null)
                return false;
    
            return MachineName.Equals(other.MachineName) && Pass.Equals(other.Pass);
        }
    }
    
    private static void Main(字符串[]args)
    {
    列表信息=生成信息();
    var filteredResults=info.ToLookup(line=>newpaintmachinelookup(line.MachineName,line.Pass),line=>line.ColorName);
    //包含包含元素“Color1”和“Color3”的IEnumerable
    var result1=filteredResults[新喷漆机查看(“机器1”,“通过1”)];
    }
    私有静态列表GenerateInfo()
    {
    //...
    }
    类PaintMachineInfo
    {
    公共字符串ColorName{get;set;}
    公共字符串MachineName{get;set;}
    公共字符串传递{get;set;}
    }
    内部类喷漆机外观
    {
    公共绘画机器观察(字符串机器名称、字符串传递)
    {
    MachineName=MachineName;
    通过=通过;
    }
    公共字符串MachineName{get;private set;}
    公共字符串传递{get;private set;}
    公共覆盖int GetHashCode()
    {
    未经检查
    {
    int x=27;
    x=x*11+MachineName.GetHashCode();
    x=x*11+Pass.GetHashCode();
    返回x;
    }
    }
    公共覆盖布尔等于(对象对象对象)
    {
    var other=喷漆机观察时的obj;
    如果(其他==null)
    返回false;
    返回MachineName.Equals(other.MachineName)和Pass.Equals(other.Pass);
    }
    }
    
    首先,从概念上讲,这里真正拥有的是一个复杂对象的单一维度,它具有颜色、机器和传递值。将其存储在二维数组中不是一个好主意。更好的表示是某种自定义类型的
    列表
    ,因此让我们先进行转换

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

    public class MachinePass//TODO consider renaming
    {
        public string Color { get; set; }
        public string Machine { get; set; }
        public string Pass { get; set; }
    }
    
    然后,我们将解析输入并将其放入适当的结构中:

    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);
    }
    
    然后,我们可以按照定义的格式打印此查询的结果:

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

    提供数组的实际声明。回答起来容易多了。这个答案看起来最有希望,因为我猜他还没有一个数组(集合)将这三个值组合在一起,以便将它们分开,以便重新组合在一起…@WonkotheSane在这种情况下,从使用
    .ToLookup改为
    ToLookup
    ,是很简单的(line=>new PaintMachineLookup(line.MachineName,line.Pass),line=>line.ColorName)
    to
    .ToLookup(line=>new PaintMachineLookup(line[1],line[2]),line=>line[0])
    (假设
    info
    是一个
    字符串[]
    )@ScottChamberlain但他说他有一个多维数组不是多维数组。在多维数组上执行转换并不是那么简单。@Servy fair point。我不确定如何才能为
    字符串[,]获取它
    ,我不经常使用它们。@ScottChamberlain认为我的答案有一种可能性。虽然你可以使用LINQ,但我发现不使用LINQ更容易。OP说输入是一个多维字符串数组,而不是元组列表。此外,将字符串压缩在一起是一种非常容易出现错误的方法,可以对两个值进行分组。如果机器1的lue为“12”,传递为“3”。它将与一行分组,其中机器值为“1”,传递为“23”。使用“&”delimiter有点帮助,但如果基础数据中的每个值之间都存在分隔符,那么它仍然可能失败。我怀疑,OP从SQL获取数据,只想使用字符串并寻找概念方法。我不明白数据是否来自SQL有什么关系;它仍然不是创建字符串的合适概念一个键。它可能导致冲突。适当的概念是创建一个新对象来表示多个值,这些值可以具有适当的“相等”定义。当然可以。但OP想要的是多维字符串数组,而不是对象。如何组织数据存储:为过程和计算机创建外键。使用EntityFramework连接到数据库。另一种创建SQL视图的方法,它将数据透视分组
    foreach(var group in query)
        Console.WriteLine("{0} for {1} & {2}",
            string.Join("/", group),
            group.Key.Machine,
            group.Key.Pass);