Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Compare multi dimentional string array?

I want to compare 2 fields. i.e Machine and Pass.

I want to concatenate 'Color' Depending upon the value of Machine and 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 
--------------|------------------|------------

I want results as follows.

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

I have no clue how to get this results. tried many ways but not getting it the way I want it

like image 849
user2783901 Avatar asked Mar 09 '26 14:03

user2783901


1 Answers

First, what you really have here, conceptually, is a single dimension of a complex object that has both a color, machine, and pass value. Storing that in a 2 dimensional array isn't a good idea. A better representation is a List of some custom type, so let's do that conversion first.

First, we'll define a custom type to represent the input data:

public class MachinePass//TODO consider renaming
{
    public string Color { get; set; }
    public string Machine { get; set; }
    public string Pass { get; set; }
}

then we'll parse our input and put it into the appropriate structure:

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

Now that we have this, we can apply our business logic. In this case what you're wanting to do is group these rows by both machine and pass, and then get the colors for those groups. The GroupBy LINQ operator makes this super easy:

var query = list.GroupBy(row => new { row.Machine, row.Pass }
    , row => row.Color);

Then we can just print out the results of this query in the defined format:

foreach(var group in query)
    Console.WriteLine("{0} for {1} & {2}",
        string.Join("/", group),
        group.Key.Machine,
        group.Key.Pass);
like image 114
Servy Avatar answered Mar 12 '26 03:03

Servy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!