2017-02-01 2 views
-2

У меня есть класс:Как сравнить два списка и изменить одно свойство

public class Doc 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public bool IsActive {get; set;} 
} 

И два списка Doc типа.

Как написать LINQ, чтобы сравнить этот список и изменить IsActive свойство первого списка, если содержит идентификатор из второго списка.

ответ

3

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

targetDocs.ForEach(d => d.IsActive = srcDocs.Any(sd => sd.id == d.Id)) 

Я предполагаю, что мы говорим о List s, а не о других типах сбора, поскольку метод расширения ForEach определен для List.

+0

Он сказал, что два списка ... – rickythefox

+1

чистых и мощного, мне это нравится! –

-1

Вы можете использовать это решение без использования LINQ

foreach(Doc x in list1){ 
    foreach(Doc y in list2){ 
    if(x.id == y.id){ 
     y.IsActive = true; 
        } 
         } 
         } 
1

Это лучше использовать HashSet<T> коллекции для таких операций, то есть быстро O (1) Lookups и нет никакой реальной причины, чтобы использовать LINQ для изменения свойства значения здесь. Правда, мы должны создать здесь еще одну коллекцию, и для выделения ресурсов инициализировать ее потребуется время, но если будет миллион записей, это даст огромный прирост производительности.

При условии, что docs1 это коллекция, где вы хотели бы изменить IsActive истинен, если docs2 коллекция имеет Id, вы можете использовать:

var ids = new HashSet<int>(docs2.Select(d => d.Id)); 
foreach(var doc in docs1) 
{ 
        // .Contains implementation in HashSet has fast O(1) lookups 
    doc.IsActive = ids.Contains(doc.Id); 
} 
0

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

static class Program 
{ 

    static void Main(string[] args) 
    { 
     List<Data> firstInstance = new List<Data> 
     { 
      new Data { Id = 1, IsActive = false }, 
      new Data { Id = 2, IsActive = false } 
     }; 

     List<Data> secondInstance = new List<Data> 
     { 
      new Data { Id = 1, IsActive = false }, 
      new Data { Id = 3, IsActive = false } 
     }; 

     firstInstance.CheckActive(secondInstance); 
    } 

    static void CheckActive(this List<Data> firstInstance, List<Data> secondInstance) 
    { 
     using (IEnumerator<Data> firstEnumerator = firstInstance.GetEnumerator(), secondEnumerator = secondInstance.GetEnumerator()) 
     { 
      while (true) 
      { 
       if (!firstEnumerator.MoveNext() || !secondEnumerator.MoveNext()) break; 
       if (firstEnumerator.Current.Id == secondEnumerator.Current.Id) firstEnumerator.Current.IsActive = true; 
      } 
     } 
    } 
} 

class Data 
{ 
    public int Id { get; set; } 
    public bool IsActive { get; set; } 
} 
0

Вы писали:

Как написать LINQ сравнить этот список и изменения «IsActive» propety из первого списка, если содержит идентификатор из второго списка.

Ваш первый список не имеет свойства IsActive, однако элементы вашего списка имеют его. Поэтому я предполагаю, что вы хотите следующее:

Как получить последовательность всех элементов в первом списке, которые имеют Id любого из элементов во втором списке, так что я могу изменить IsActive свойства тех элементы.

LINQ используется для перечисления объектов. Вы не можете изменить объект в инструкции linq

Если вы хотите изменить объекты, вам придется перечислить их, например, с помощью ForEach.

IEnumerable<int> activeIds = secondList.Select(item => item.Id); 
IEnumerable<Doc> activeDocs = firstList.Where(item => activedIds.Contains(item.Id)); 

foreach (Doc activeDoc in activeDocs) 
{ 
    activeDoc.IsActive = true; 
} 

Опасайтесь: я не изменил ISActive для всех inActive docs.Если вы хотите, что вы должны будете Foreach всех элементов из вашего firstList:

IEnumerable<int> activeIds = secondList.Select(item => item.Id); 
foreach (Doc doc in firstList) 
{ 
    doc.IsActive = activeIds.Contains(doc.Id); 
} 
Смежные вопросы