2015-09-30 4 views
3

Мне нужно создать 2 отдельных списка из 1 списка. Если company.IsNone истинно, я хочу, чтобы все сотрудники добавили в первый список, который соответствует списку местоположенийToCompare, если это не так, я хочу, чтобы все сотрудники не соответствовали списку местоположенийToCompare. Это полная противоположность при заполнении второго списка. Есть ли способ объединить эти два оператора if в один, или я вынужден иметь два отдельных для заполнения двух списков?Есть ли способ объединить эти два оператора LINQ в один

var noneEmployees = company.IsNone 
     ? employees.Where(employee => locationsToCompare.Any(x => x.ID == employee.LocationID)).ToList() 
     : employees.Where(employee => locationsToCompare.All(x => x.ID != employee.LocationID)).ToList(); 

var locationEmployees = company.IsNone 
     ? employees.Where(employee => locationsToCompare.All(x => x.ID != employee.LocationID)).ToList() 
     : employees.Where(employee => locationsToCompare.Any(x => x.ID == employee.LocationID)).ToList(); 
+1

'.GroupBy' возможно? –

+1

@MattBurland GroupBy будет сложным, поскольку списки могут иметь непустое пересечение (из-за 'Any') ... Я не могу думать ни о чем, кроме« Агрегат », но это выглядит более неудобно, чем два отдельных' Where' calls (предполагая, что код действительно выполняет то, что требуется OP). –

+1

Боковое примечание: код не соответствует описанию (Any (! =) И Any (==) не противоположны. –

ответ

1

попробовать что-то вроде этого, используя Except так что вам не придется повторять весь код:

public class Company 
{ 
    public bool IsNone { get; set; } 
} 

public class Employee 
{ 
    public int LocationID { get; set; } 
} 

public class Location 
{ 
    public int ID { get; set; } 
} 

Операцию

var locationsToCompare = new List<Location> { new Location() { ID = 1 }, new Location() { ID = 2 } }; 

var employees = new List<Employee> { new Employee() { LocationID = 1 }, new Employee { LocationID = 2 }, new Employee { LocationID = 1}, new Employee { LocationID = 5 } }; 

var company = new Company(); 

company.IsNone = false; 

var noneEmployees = company.IsNone 
        ? employees.Where(employee => locationsToCompare.Any(x => x.ID == employee.LocationID)).ToList() 
        : employees.Where(employee => locationsToCompare.All(x => x.ID != employee.LocationID)).ToList(); 

var locationEmployees = employees.Except(noneEmployees).ToList(); 
1

Вы можете также извлечь идентификаторы местоположение в отдельный список и использовать это в предложении Where() вместе с xor для IsNone. Объединение, что с Except() оператора решением @ Leigh-shepperson, вы получите это:

var locationIds = locationsToCompare.Select(location => location.ID); 
noneEmployees = employees.Where(employee => !company.IsNone^locationIds.Contains(employee.LocationID)); 
locationEmployees = employees.Except(noneEmployees); 

Я не знаю, если это самое читаемым решение, но это позволяет сделать его короче.

2

Группа сотрудников зависит от того, установлен ли флаг компании IsNone.

Но прежде чем это выяснять, давайте сгруппировать сотрудников, используя ToLookup(TSource, TKey), который является поиском словаря/типа группировки, где ключ заключается в том, является ли сотрудник в списке locationsToCompare.

Как только поиск будет настроен, мы можем установить трубку в компании IsNone и вывести сотрудников.


Пример установки данных

var employees = new List<Employee> 
     { new Employee { LocationID = 1, Name = "Hamilton" }, 
      new Employee { LocationID = 2, Name = "Joe"  }, 
      new Employee { LocationID = 1, Name = "Frank" }, 
      new Employee { LocationID = 5, Name = "Reynolds" } }; 

var company = new Company() { IsNone = false }; 

Местоположение

var locationsToCompare = new List<Location> { new Location() { ID = 1 }, 
               new Location() { ID = 2 } }; 

Содержит

Я в конечном итоге используйте Contains вместо предложения where, поэтому я перегоняю locationsToCompare в список идентификаторов.

var LocationIds = locationsToCompare.Select(ltc => ltc.ID); 

Этот шаг может быть пропущен, но я считаю, что это делает его легче поддерживать.

ToLookup

Теперь мы используем ToLookup и затем извлечь наши списки на основе компании 'IsNone' флаг:

var empLookup = employees.ToLookup(emp => LocationIds.Contains(emp.LocationID)); 

var noneEmployees  = empLookup[company.IsNone].ToList(); 
var locationEmployees = empLookup[!company.IsNone].ToList(); 

Результат

enter image description here


Как выглядел поиск? Потому что это тяжелый подъем для нас.

enter image description here

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