2011-10-11 3 views
0

У меня есть следующий цикл foreach:Как выполнить этот вид работы с LINQ?

List<WorkingJournal> workingJournals = new List<WorkingJournal>(); 
foreach (WorkRoster workRoster in workRosters) 
{ 
    bool exists = workingJournals.Any(workingJournal => workingJournal.ServicePlan.Id == workRoster.ServicePlan.Id 
             && workingJournal.Nurse.Id == workRoster.Nurse.Id 
             && workingJournal.Month == workRoster.Start.Month 
             && workingJournal.Year == workRoster.Start.Year); 

    if (exists == false) 
    { 
       WorkingJournal workingJournal = new WorkingJournal 
       { 
        ServicePlan = workRoster.ServicePlan, 
        Nurse = workRoster.Nurse, 
        Month = workRoster.Start.Month, 
        Year = workRoster.Start.Year 
       }; 

       workingJournals.Add(workingJournal); 
    } 
} 

Я начал писать:

from workRoster in workRosters 
select new WorkingJournal 
       { 
        ServicePlan = workRoster.ServicePlan, 
        Nurse = workRoster.Nurse, 
        Month = workRoster.Start.Month, 
        Year = workRoster.Start.Year 
       }; 

Но теперь я застрял со сравнением, которое производит различные WorkingJournals.
У меня такое чувство, что здесь должно быть предложение group by, но я не уверен, как это сделать.

+1

Поместите все это в скобки, затем выполните '.Distinct()'. –

+1

Является ли это Linq для Sql или Linq для объектов? – Joe

+0

Linq к объектам. –

ответ

1

Если у вас есть соответствующие Equals и GetHashCode реализации внутри ваш класс, вы можете просто вызвать Distinct().

var result = workRosters.Select(...).Distinct(); 

На случайно у вас нет таких реализаций, вы можете определить IEqualityComparer<WorkingJournal> реализацию. Это позволит вам определить методы Equals и GetHashCode для T, которые затем могут использоваться словарем или хешсетом, а также могут использоваться при перегрузках Distinct() в Linq.

class JournalComparer : IEqualityComparer<WorkingJournal> 
{ 
    public bool Equals(WorkingJournal left, WorkingJournal right) 
    { 
     // perform your equality semantics here 
    } 

    public int GetHashCode(WorkingJournal obj) 
    { 
     // return some hash code here. 
     return obj.ServicePlan.GetHashCode(); 
    } 
} 

var comparer = new JournalComparer(); // implements the interface 
var result = workRosters.Select(r => new WorkingJournal { ... }).Distinct(comparer); 
3

Предполагая, что LINQ к объектам:

(from workRoster in workRosters 
select new WorkingJournal 
      { 
       ServicePlan = workRoster.ServicePlan, 
       Nurse = workRoster.Nurse, 
       Month = workRoster.Start.Month, 
       Year = workRoster.Start.Year 
      }).Distinct(); 

Обратите внимание, что для этой работы вам необходимо Equals и GetHashCode реализован для WorkingJournal объекта. Если нет, см ответ Энтони: How to perform a this kind of Distinct operation with LINQ?


Если это LINQ к SQL можно групповым новое выражение, а затем выберите ключ группы:

from workRoster in workRosters 
group workRoster by new WorkingJournal 
      { 
       ServicePlan = workRoster.ServicePlan, 
       Nurse = workRoster.Nurse, 
       Month = workRoster.Start.Month, 
       Year = workRoster.Start.Year 
      } into workRosterGroup 
select workRosterGroup.Key; 
+0

так почему исходный кодер сравнивал его с рабочим списком? –

+0

Ваш код добавляет все рабочие реестры в новый список, если его еще нет в списке. Мой код эффективно добавляет все, а затем удаляет дубликаты, что то же самое. –

Смежные вопросы