2013-12-20 5 views
1

Рассмотрим следующую функциюLINQ игнорировании где, если SomeObject является нулевым

public static string UpdateCommand<T>(List<string> Except=null,List<string> Only=null) 
     { 
      if (Except != null && Only != null) 
       { 
       throw new Exception(); 
       } 

     List<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 


     if (Except != null) 
     { 
      for (int i = properties.Count; i-- > 0;) 
      { 
       if (Except.Contains(properties[i].Name)) properties.RemoveAt(i); 
      } 
     } 

     if(Only != null) 
     { 
      for (int i = properties.Count; i-- > 0;) 
      { 
       if (!Only.Contains(properties[i].Name)) properties.RemoveAt(i); 
      } 
     } 
     //etc... 
     } 

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

Я пытаюсь выяснить синтаксис Linq для вышеописанного, есть ли способ написать оператор where, но игнорировать инструкцию where, если список для сравнения равен нулю?

В основном я ищу способ написать выше, используя только LINQ.

я не могу использовать Intersect или исключение, поскольку его между 2 различными типами

ответ

3
var result = properties 
    .Where(p => !(Except ?? Enumerable.Empty<String>()).Any(s => s == p.Name)) 
    .Where(p => Only == null || Only.Any(s => s == p.Name)) 
    .ToArray(); 
2

Я предлагаю вам не удается фильтрация в этом методе вообще. Вместо этого, вы можете сделать так:

public static string UpdateCommand<T>(Func<IEnumerable<PropertyInfo>, IEnumerable<PropertyInfo>> filterFunc = null) 
{ 
    IEnumerable<PropertyInfo> properties = typeof(T).GetProperties(); 

    if (filterFunc != null) 
     properties = filterFunc(properties); 

    ... 
} 

Используйте это так:

UpdateCommand(pis => pis.Where(pi => ...)) 
2

Этот тип вещи недавно обсуждался here в статье о возможных C# 6,0 функций (пункт 7). В настоящее время это не реально, без какой-либо работы, например, как показано в предыдущем ответе.

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