LINQ忽略了someobject为null的位置

时间:2013-12-20 14:33:54

标签: c#

考虑以下功能

 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...
        }

它需要两个可选参数,它们都可以为null,或者它们中的任何一个都可以有一个值,但至少其中一个应为null。

我试图找出上面的Linq语法,有没有办法写一个where语句但忽略where语句,如果要比较的列表是null?

基本上我正在寻找一种只使用LINQ编写上述内容的方法。

我不能使用Intersect或Except,因为它介于两种不同类型之间

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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 :(得分:2)

最近在一篇关于可能的C#6.0功能(第7项)的文章中讨论了这类事情here 。如果没有一些解决办法,目前还不是很有可能,例如上一个答案所示。