Найти список класса в списке класса с лямбда - PullRequest
0 голосов
/ 25 июня 2018

У меня есть класс Synchronize

internal sealed class Synchronize
{
    internal _File File { get; set; } = new _File();
    internal _Log Log { get; set; } = new _Log();

    internal sealed class _File
    {
        internal string Folder { get; set; }
        internal string Name { get; set; }
        internal string Extention { get; set; }
        internal string Create_Date_Time { get; set; }
        internal long Size { get; set; }
        internal int RecordCount { get; set; }
    }

    internal sealed class _Log
    {
        internal string Folder { get; set; }
        internal string Name { get; set; }
        internal string Extention { get; set; }
        internal string CreateDateTime { get; set; }
    }
}

У меня есть другой класс Migrate

internal sealed class Migrate
{
    internal string FileFolder { get; set; }
    internal string FileName { get; set; }
    internal int RecordCount { get; set; }
    internal bool CanMigrate { get; set; } = false;
}

У меня есть

List<Synchronize> synchronize

и

List<Migrate> migrate

синхронизация имеет более 100 элементов списка, но миграция имеет более 1 элементов списка.

Есть ли способ использовать лямбда-выражение, чтобы найти все синхронизируемые элементы, которые существуют в миграции, с помощью поиска migrate.FileFolder && migrate.FileName && migrate.RecordCount?

Я знаю, как выполнить лямбда-поиск по синхронизации с помощью итерации, хотя и миграции, но я пытаюсь избежать итерации и пытаюсь узнать больше лямбды, это так здорово, когда вы начинаете понимать это:)

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

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

var results = synchronize.Where(s => migrate.Any(m => /* compare here */));

Но я бы, вероятно, использовал объединение:

var results = from s in synchronize
              join m in migrate
              on new { s.File.Folder, s.File.Name, s.File.RecordCount }
              equals new { Folder = m.FileFolder, Name = m.FileName, m.RecordCount }
              select s;

Или в лямбда-синтаксисе:

var results = synchronize.Join(migrate,
    s => new { s.File.Folder, s.File.Name, s.File.RecordCount },
    m => new { Folder = m.FileFolder, Name = m.FileName, m.RecordCount },
    (m, s) => s);
0 голосов
/ 25 июня 2018

Да, это можно сделать следующим образом:

var synchronize = new List<Synchronize>();
//fill synchronize    
var migrate = new List<Migrate>();
//fill migrate

var result = synchronize
    .Where(s => migrate.Exists(m => m.FileFolder == s.File?.Folder
                                    && m.FileName == s.File?.Name
                                    && m.RecordCount == s.File?.RecordCount)
    .ToList();

Как упоминалось в комментариях к DavidG, лучше использовать метод Extension Any, работающий с любым Enumerable.Exists работает только на List.

result = synchronize
    .Where(s => migrate.Any(m => m.FileFolder == s.File?.Folder
                                    && m.FileName == s.File?.Name
                                    && m.RecordCount == s.File?.RecordCount))
    .ToList();
0 голосов
/ 25 июня 2018

Вы можете сделать это, используя комбинацию Where и FirstOrDefault:

var result = synchronize.Where(s => migrate.FirstOrDefault(m => m.FileFolder == s.File.Folder && m.FileName == s.File.Name && m.RecordCount == s.File.RecordCount) != null);

или используя Any:

var result = synchronize.Where(s => migrate.Any(m => m.FileFolder == s.File.Folder && m.FileName == s.File.Name && m.RecordCount == s.File.RecordCount));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...