Как сравнить два списка, в C #, используя два параметра (например, левое соединение) - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь два сравнить два списка, но с 2 параметрами.Я хочу присоединиться к списку слева.

list1

[0] 1 , "cat11" , 1
[1] 2 , "cat12" , 1
[2] 3 , "cat13" , 1
[3] 4 , "cat14" , 1
[4] 5 , "cat15" , 1
[5] 6 , "cat16" , 1
[5] 1 , "cat31" , 3
[5] 1 , "cat41" , 4

list2

[0] 1 , 4
[1] 1 , 5
[2] 3 , 1

Эквивалентность

list1.codigo1 <=> list2.cod2
list1.codigo2 <=> list2.cod1

Я хочу вернуться, но не могуумеете сравнивать по двум значениям;

[0] 4 , "cat14" , 1
[1] 5 , "cat15" , 1
[2] 1 , "cat31" , 3

Ответы [ 3 ]

0 голосов
/ 11 июня 2019

Исходя из ваших примеров данных, кажется, что вы действительно хотите фильтровать элементы в list1 на основе значений свойств элементов в list2, вместо того, чтобы делать какие-либо join .

Если это так, то вы можете получить отфильтрованные результаты, используя метод расширения System.Linq, Where, который можно использовать для выбора только элементов из list1которые удовлетворяют условию, что list1.codigo1 == list2.cod2 и list1.codigo2 == list2.cod1:

var filtered = list1
    .Where(l1 => list2.Any(l2 => l1.codigo1 == l2.cod2 && l1.codigo2 == l2.cod1)
    .ToList();

Это эквивалентно вложенному циклу, который выполняет итерацию по каждому элементу в первом списке, а затем для каждого элемента он выполняет итерации повторой список, ищем условия нашего соответствия.Если условие соответствия найдено, мы добавляем первый элемент в наш «отфильтрованный» список:

var filtered = new List<SomeType>();

foreach(SomeType l1 in list1)
{
    foreach(SomeOtherType l2 in list2)
    {
        if (l1.codigo1 == l2.cod2 && l1.codigo2 == l2.cod1)
        {
            filtered.Add(l1);
            break;
        }
    }
}
0 голосов
/ 11 июня 2019

Похоже, это то, что вам нужно. Я настоятельно рекомендую вам прочитать это . Вы можете играть с этим кодом здесь .

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

public class Program
{
   public class Item1 
   {
      public int Codigo1 { get; set; }

      public string Name { get; set; }

      public int Codigo2 { get; set; }      
  }

  public class Item2
  {
    public int Cod1 { get; set; }

    public int Cod2 { get; set; }
  }

  public static void Main()
  {
    var list1 = new List<Item1>() {
        new Item1() { Codigo1 = 1, Name = "cat11", Codigo2 = 1 },
        new Item1() { Codigo1 = 2, Name = "cat12", Codigo2 = 1 },
        new Item1() { Codigo1 = 3, Name = "cat13", Codigo2 = 1 },
        new Item1() { Codigo1 = 4, Name = "cat14", Codigo2 = 1 },
        new Item1() { Codigo1 = 5, Name = "cat15", Codigo2 = 1 },
        new Item1() { Codigo1 = 6, Name = "cat16", Codigo2 = 1 },
        new Item1() { Codigo1 = 1, Name = "cat31", Codigo2 = 3 },
        new Item1() { Codigo1 = 1, Name = "cat41", Codigo2 = 4 }
    };

    var list2 = new List<Item2>() {
        new Item2() { Cod1 = 1, Cod2 = 4 },
        new Item2() { Cod1 = 1, Cod2 = 5 },
        new Item2() { Cod1 = 3, Cod2 = 1 }
    };

    var result = from l1 in list1
                 join l2 in list2 
                 on new { a = l1.Codigo1, b = l1.Codigo2 } equals  new { a= l2.Cod2, b= l2.Cod1 }
                 select new { Codigo1 = l1.Codigo1, Name = l1.Name, Codigo2 = l1.Codigo2 };


    foreach(var r in result)
    {
        Console.WriteLine(r.Codigo1 + " " + r.Name + " " + r.Codigo2);
    }
  }
}

Ожидаемый результат

4 cat14 1

5 cat15 1

1 cat31 3
0 голосов
/ 11 июня 2019

Вы можете использовать linq для объединения двух списков. как то так:

// valueSet equals an array of values i.e. [1, "cat11", 1] or [5, 1]
list2.select(valueSet => list1.FirstOrDefault(
    valueSet2 => valueSet2[2] == valueSet[0] &&
        valueSet2[0] == valueSet[1]));

по сути, вы используете метод выбора linq, чтобы «выбрать» элемент из списка1 для каждого элемента в списке2. select lambda дает вам набор значений из list2, а затем вы его используете, поэтому найдите первое совпадение (первое или по умолчанию) в list1 и верните его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...