Click here to Skip to main content
15,884,388 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I'm using the below code to determine the number of equal elements in two lists (x of 256):

C#
List<string> secretData1 = new List<string>() { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple" };
    List<string> secretData2 = new List<string>() { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange" };
    
    int equalElements = secretData1.Zip(secretData2, (i, j) => i == j).Count(eq => eq);     
    Console.WriteLine(equalElements);



Equal Elements (Output): 114

Now, I want to convert this code on a larger scale for a single list.


C#
public class SecretAgents
{
    public string Name {get; set;}
    public List<string> SecretData {get; set;}
    public int GroupID {get; set;}
}

    List<SecretAgents> secretAgents = new List<SecretAgents>();
    
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 1", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 2", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 3", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 4", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange"} });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 5", GroupID= 0, SecretData= new List<string> { "apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple"} });



I want to group SecretAgents that have equal elements > 200.

Expected Output:

C#
Group 1: SecretAgent 1 & SecretAgent 3 (Reason: Equal elements: 248)
    Group 2: SecretAgent 2 & SecretAgent 4 (Reason: Equal elements: 256)
    Group 3: SecretAgent 5



Any help is appreciated.

What I have tried:

First code in the question (.Zip)
Posted
Updated 3-Sep-22 4:44am
v2

[UPDATE #2]

Okay, I have redone the code in Linq Query Syntax and broken down each step to make it:
1. easier to read & debug
2. easier to maintain

I have also moved your comparer to an inline method. It can be moved to a normal method.

C#
int minCount = 150;

int MyComparer(SecretAgents secretAgent1, SecretAgents secretAgent2)
{
    var result = secretAgent1.SecretData.Zip(secretAgent2.SecretData, (i, j) => i == j);
    var count = result.Count(eq => eq);

    Console.WriteLine($".... {secretAgents.IndexOf(secretAgent1)} <> {secretAgents.IndexOf(secretAgent2)} = {count}");

    return count;
}

Console.WriteLine("1. Manual Comparison");
var equalElements = new List<int>
{
    MyComparer(secretAgents[0], secretAgents[1]),
    MyComparer(secretAgents[0], secretAgents[2]),
    MyComparer(secretAgents[0], secretAgents[3]),
    MyComparer(secretAgents[0], secretAgents[4]),
    MyComparer(secretAgents[1], secretAgents[2]),
    MyComparer(secretAgents[1], secretAgents[3]),
    MyComparer(secretAgents[1], secretAgents[4]),
    MyComparer(secretAgents[2], secretAgents[3]),
    MyComparer(secretAgents[2], secretAgents[4]),
    MyComparer(secretAgents[3], secretAgents[4]),
};

Console.WriteLine();
Console.WriteLine("--");
Console.WriteLine();

Console.WriteLine("2. Linq Filter");

var groups = from secretAgent in secretAgents
    group secretAgent by secretAgent.GroupID;

var filtered = from grp in groups
    from leftAgent in grp
    from rightAgent in grp
    where leftAgent != rightAgent &&
          grp.ToList().IndexOf(leftAgent) < grp.ToList().IndexOf(rightAgent) &&
          MyComparer(leftAgent, rightAgent) > minCount
    select (grp.Key, leftAgent, rightAgent);

var formatted = filtered
    .GroupBy(x => x.Key)
    .SelectMany(group => group
        .Select(item =>
        {
            var count = MyComparer(item.leftAgent, item.rightAgent);
            return
                $"Group {group.Key}: {item.leftAgent.Name} & {item.rightAgent.Name} (reason: Equal elements: {count})";
        })
    );

foreach (string equalElement in formatted)
{
    Console.WriteLine(equalElement);
}

and the output, with debug output:
1. Manual Comparison
.... 0 <> 1 = 114
.... 0 <> 2 = 248
.... 0 <> 3 = 114
.... 0 <> 4 = 156
.... 1 <> 2 = 112
.... 1 <> 3 = 256
.... 1 <> 4 = 82
.... 2 <> 3 = 112
.... 2 <> 4 = 156
.... 3 <> 4 = 82

--

2. Linq Filter
.... 0 <> 1 = 114
.... 0 <> 2 = 248
.... 0 <> 3 = 114
.... 0 <> 4 = 156
.... 1 <> 2 = 112
.... 1 <> 3 = 256
.... 1 <> 4 = 82
.... 2 <> 3 = 112
.... 2 <> 4 = 156
.... 3 <> 4 = 82
.... 0 <> 2 = 248
Group 0: SecretAgent 1 & SecretAgent 3 (reason: Equal elements: 248)
.... 0 <> 4 = 156
Group 0: SecretAgent 1 & SecretAgent 5 (reason: Equal elements: 156)
.... 1 <> 3 = 256
Group 0: SecretAgent 2 & SecretAgent 4 (reason: Equal elements: 256)
.... 2 <> 4 = 156
Group 0: SecretAgent 3 & SecretAgent 5 (reason: Equal elements: 156)


Enjoy!
 
Share this answer
 
v11
Comments
Cat Lover 2-Sep-22 22:31pm    
I'm really sorry. I accidentally omitted one important part of my question which made gave a different understanding to the readers. Could you please have a look at my edited question, if possible? Thanks.
Graeme_Grant 2-Sep-22 22:38pm    
Your sample data all have group 0 ... you need to update this.

Also, you need to update the first example with the desired output. Then I will have a look at it.
Cat Lover 2-Sep-22 23:04pm    
Thanks for your reply. I really appreciate your time.

1) "Your sample data all have group 0 ... you need to update this"

Each Secret Agent has 0 as it's default Group ID. What I want is group Secret Agents that have more than 200 equal elements into corresponding groups like Group 1, Group 2, Group 3 (as in the "Expected Output")

2) "you need to update the first example with the desired output."

The first example is a working example that gives me 114. I gave it as a hint, idea to illustrate my broader question.
Graeme_Grant 2-Sep-22 23:21pm    
Ah, you want me to do all of the work for you.
Cat Lover 3-Sep-22 0:18am    
Hello, I compiled your code. But the result (82 equal elements within all Secret Agents, thus they all in single group) is incorrect. SecretAgent 1 and SecretAgent 3 have 248 common elements and Secret Agent 2 and Secret Agent 4 have 256 common elements. I verified that using the first .Zip function in short example.

I suggest that you adopt a simple approach. Something like:

C#
//iterate over all possible matches and set each agents GroupId to the max value found
  for(int i=0;i<secretAgents.Count-1;i++)
   {
     for(int j=i+1;j<secretAgents.Count;j++)
      {
        var matchesCount = secretAgents[i].SecretData.Zip(secretAgents[j].SecretData, 
                                          (x, y) => x == y).Count(b => b == true); 
        if (matchesCount > secretAgents[i].GroupID) secretAgents[i].GroupID = matchesCount;
        if (matchesCount > secretAgents[j].GroupID) secretAgents[j].GroupID = matchesCount;
      }
    }
   //select the groups using the GroupID as the key and >200 as the filter
     var groups = secretAgents.Where(a => a.GroupID > 200).GroupBy(a => a.GroupID);
   //output the results
     foreach(var grp in groups)
      {
        Console.WriteLine($"GroupId={grp.Key}, Members {string.Join(", ", grp.Select(a => a.Name))}");
        //prints:GroupId=248, Members SecretAgent 1, SecretAgent 3
        //GroupId = 256, Members SecretAgent 2, SecretAgent 4
      }

 
Share this answer
 
Comments
Cat Lover 4-Sep-22 3:10am    
There appears to be no problem. Kindly ignore my previous comment. Thank you!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900