Сравните два списка через два свойства в дополнение к наличию списка уникальных значений из третьего свойства, создающего новые списки - PullRequest
0 голосов
/ 24 апреля 2020

Допустим, у меня есть две коллекции ExampleCollection1 и ExampleCollection2. Я хочу перебрать linq, сравнивая свойства 'ab' и 'gh' из обеих коллекций с разными значениями для xy и создать новый список. Я не беспокоюсь об изображении.

 var ex1List = new List<ExampleCollection1>
 {
    new ExampleCollection1 {ab = "10", gh = "200" },
    new ExampleCollection1 {ab = "10", gh = "300" },
    new ExampleCollection1 {ab = "10", gh = "400" },
    new ExampleCollection1 {ab = "10", gh = "500" },
    new ExampleCollection1 {ab = "10", gh = "600" }
 };

   var ex2List = new List<ExampleCollection2>
   {
    new ExampleCollection2 {ab = "10", gh = "200", xy = "5", image = "star"},
    new ExampleCollection2 {ab = "10", gh = "200", xy = "10", image = "moon"},
    new ExampleCollection2 {ab = "10", gh = "400", xy = "4", image = "globe" },
    new ExampleCollection2 {ab = "10", gh = "400", xy = "4", image = "earth" },//this should not be in the resulting collection as previous entry and this are same for ab, gh, and xy
    new ExampleCollection2 {ab = "10", gh = "600", xy = "3", image = "twinkle" }
   };

Итак, мне нужен окончательный список, содержащий

var finalList = new List<ExampleCollection2>
            {
                new ExampleCollection2 {ab = "10", gh = "200", xy = "5", image = "star"},
                new ExampleCollection2 {ab = "10", gh = "200", xy = "10", image = "moon"},
                new ExampleCollection2 {ab = "10", gh = "400", xy = "4", image = "globe" },
                new ExampleCollection2 {ab = "10", gh = "600", xy = "3", image = "twinkle" }
            };

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

 foreach (var item in ex1List)
            {
                var finalList = ex2List?.FindAll(val => val.ab != null && val.gh != null &&
                    CheckEquals(item.ab, item.gh, val.ab, val.gh)); // here need  to check for distinct values for xy too. how to do that ?

                foreach(var x in finalList)
                {
                    Console.WriteLine(x.ab + x.gh + x.xy + x.image);
                }
            }

private bool CheckEquals(<...>)
{
...
}

1 Ответ

1 голос
/ 24 апреля 2020

Это довольно просто. Попробуйте это:

var finalList =
(
    from ex1 in ex1List
    join ex2 in ex2List on new { ex1.ab, ex1.gh } equals new { ex2.ab, ex2.gh }
    group ex2 by ex2.xy into gex2s
    from gex2 in gex2s.Take(1)
    select gex2
).ToList();

Это дает мне:

finalList

Это зависит от порядка ex2List для исключения earth более globe. Возможно, вам придется включить orderby, чтобы обеспечить определенный выбор c.

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