Как установить флаг в одном списке для идентификаторов, которые совпадают с идентификаторами в другом списке, используя лямбда-выражение c # - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть два списка списков

public class class1{
 public Int Id { get; set; }
 public Bool Flag{ get; set; }
}

public class class2{
 public Int Id { get; set; }
}

Теперь у меня есть List<class1> и List<class2>, теперь мне нужно обновить свойство Flag до true в List<class1> только для тех идентификаторов, которые соответствуют идентификаторамприсутствует в List<class2> с использованием лямбда-выражения c #. Не хочу использовать foreach.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Приведенное ниже решение не использует классическое «для каждого», но компилируется в одно под капотом.Если это не то, что вы имели в виду, пожалуйста, объясните, чего вы пытаетесь достичь.Использование для каждого в этом примере является хорошим подходом.Можно также использовать циклы while или for, но это действительно то, о чем здесь идет речь?

Определение объекта:

public class MyObject
{
    public int Id { get; set; }
    public bool Flag { get; set; }
}

Инициализация списка:

var list = new List<MyObject>()
{
    new MyObject() { Id= 1 },
    new MyObject() { Id= 2 },
    new MyObject() { Id= 3 },
    new MyObject() { Id= 4 }
};

var list2 = new List<MyObject>()
{
    new MyObject() { Id= 2 },
    new MyObject() { Id= 4 }
};

Код:

list.ForEach(el => el.Flag = list2.Any(el2 => el2.Id == el.Id));

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

Пример с циклом while (немного неприятно сделать это таким образом):

int i = -1;
int numberOfElements = list.Count;
while (++i < numberOfElements)
{
    list[i].Flag = list2.Any(el => el.Id == list[i].Id);
}

Полагаю, вы сами можете написать цикл for ...

0 голосов
/ 26 сентября 2018

с использованием лямбда-выражения.Не хочу использовать foreach.

Обычно это глупое требование и отличительная черта, с которой вы не очень знакомы в C #, Linq или анализе производительности.У вас есть коллекция, элементы которой вы хотите изменить, поэтому вы должны использовать foreach().

Если вы пробуете функциональное программирование, вам следует рассматривать элементы списка как неизменяемые и проектировать в новую коллекцию.

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

var elementsToModify = list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id));

Теперь с foreach() это будет просто:

foreach (var l1 in elementsToModify)
{
    l1.Flag = true;
}

Или, даже более плотный (не то, что меньше кода означает больше производительности):

foreach (var l1 in list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id)))
{
    l1.Flag = true;
}

Итак, ваш код.Но вы не хотели использовать foreach().Затем вам нужно спроецировать в новую коллекцию:

var newList1 = list1.Where(l1 => list2.Any(l2 => l2.Id == l1.Id))
                    .Select(l1 => new Class1 
                    {
                        Id = l1.Id,
                        Flag = true,
                    })
                    .ToList();

Там у вас есть List<Class1> только с помеченными элементами.При желании вы можете использовать этот список в foreach() для обновления оригинала list1.Ой, подожди.

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