Найти совпадения из 5 списков, основываясь на условии совпадения - PullRequest
0 голосов
/ 20 октября 2018

Учитывая, что у меня есть модель, которая выглядит следующим образом:

public sealed class BaseInfo
    {
        public string ValueToBeMatched { get; set; }

        public string CreatedValue { get; set; }
    }

И у меня есть переменные, которые инициализировали класс BaseInfo, как показано ниже:

List<BaseInfo> zeroBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "003",
      CreatedValue = "2007-10-10"
   },
}

List<BaseInfo> firstBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

List<BaseInfo> secondBaseInfo= new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
}

List<BaseInfo> thirdBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

List<BaseInfo> fourthBaseInfo = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "",
      CreatedValue = DateTime.Now.ToString("yyyy-MM-dd")
   },
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2008-10-10"
   },
}

Условие5 списков должны совпадать с 2 или более совпадениями друг с другом, тогда результат будет сохранен в новом списке.

Я думаю об использовании цикла for для каждого списка и сделаю оператор ifв каждом цикле сопоставляется условие с каждым индексом списка.Но я застрял.

Вот код, на котором я застрял:

for (int i = 0; i < zeroBaseInfo.Count; i++)
            {
                for (int j = 0; j < firstBaseInfo.Count; j++)
                {
                    for (int k = 0; k < secondBaseInfo.Count; k++)
                    {
                        for (int o = 0; o < thirdBaseInfo.Count; o++)
                        {
                            for (int p = 0; p < fourthBaseInfo.Count; p++)
                            {
                                // I am stuck in this point to what needs to be compare, as if statement only works against comparison value between 1 to 1 and not all of lists.
                            }
                        }
                    }
                }
            }

РЕДАКТИРОВАТЬ:

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

List<BaseInfo> matchedNewLists = new List<BaseInfo>
{
   new BaseInfo
   {
      ValueToBeMatched = "001",
      CreatedValue = "2006-10-10"
   },
   new BaseInfo
   {
      ValueToBeMatched = "002",
      CreatedValue = "2008-10-10"
   }
}

Поскольку 001 и 002 выполнены условие (2 совпадения или более) в 5 списках выше

Любая помощь и ваш ответ высоко ценится.

Спасибомного!

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вы можете использовать linq.

List<BaseInfo> matchedNewLists = 
                zeroBaseInfo
                .Union(firstBaseInfo)
                .Union(secondBaseInfo)
                .Union(thirdBaseInfo)
                .Union(fourthBaseInfo)
                .GroupBy(bi => new { bi.ValueToBeMatched, bi.CreatedValue})
                .Where(grp => grp.Count() > 1)
                .Select(grp => 
                        new BaseInfo()
                        {
                            ValueToBeMatched = grp.Key.ValueToBeMatched,
                            CreatedValue = grp.Key.CreatedValue
                        })
                .ToList();
0 голосов
/ 20 октября 2018

Это можно сделать с помощью нескольких операций LINQ.Я разделил их, чтобы было понятно, что я здесь делаю:

var oneLongList = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }.SelectMany(x => x);
var allValuesToBeMatched = oneLongList.Select(x => x.ValueToBeMatched);
var grouped = allValuesToBeMatched.GroupBy(x => x);
var filtered = grouped.Where(x => x.Count() >= 2).Select(x => x.Key);
var finalResult = filtered.Select(x => new BaseInfo { ValueToBeMatched = x });

Или вы можете объединить их все в одно:

var finalResult = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }
    .SelectMany(x => x)
    .Select(x => x.ValueToBeMatched)
    .GroupBy(x => x)
    .Where(x => x.Count() >= 2)
    .Select(x => new BaseInfo { ValueToBeMatched = x.Key });

РЕДАКТИРОВАТЬ:

var finalResult = new[] { zeroBaseInfo, firstBaseInfo, secondBaseInfo, thirdBaseInfo, fourthBaseInfo }
    .SelectMany(x => x)
    .GroupBy(x => x.ValueToBeMatched)
    .Where(x => x.Count() >= 2)
    .Select(x => x.First());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...