避免在LINQ查询中使用内部.ToList()吗?

时间:2019-03-04 18:25:38

标签: c# performance linq

我正在构建一个使用List<T>并将其转换为DataTabe的方法。在此过程中,我想过滤掉所有带有[NotMapped]属性标记的属性。

我可以使用整个方法,但是我担心其中的一部分……淘汰[NotMapped]属性的那一部分。这就是我所拥有的:

    public static DataTable CreateDataTable<T>(IEnumerable<T> list)
    {
        Type type = typeof(T);

        var properties = type.GetProperties().Where(p =>
                        p.CustomAttributes.ToList().Count == 0 ||
                        (p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
                        ).ToList();

        // Rest of the method...
    }

因此,它可以按我的意愿工作,并且摆脱了任何看起来像这样的东西,例如,所以它不会出现在最后的DataTable中:

    [NotMapped]
    public string Description { get; set; }

我关心的是性能,只是一般的最佳实践。 var properties = LINQ查询对我来说似乎很笨拙,但是我没有看到更有效的方法来对其进行改进。

也就是说,我不喜欢拨打p.CustomAttributes.ToList() 3次。有办法避免这种情况吗?

2 个答案:

答案 0 :(得分:3)

let rect: CGRect = CGRect(x: 0, y: -25, width: size.width, height: size.height)

答案 1 :(得分:0)

要回答原始问题,可以通过保存其返回值来避免多次调用ToList()

type.GetProperties().Where(p =>
                    p.CustomAttributes.ToList().Count == 0 ||
                    (p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
                    )

...变成...

type.GetProperties().Where(p => 
{
    var attrs = p.CustomAttributes.List();
    return attrs.Count == 0 || (attrs.Count > 0 && attrs[0].AttributeType.Name != "NotMappedAttribute");
})

但是,我建议您这样做:

type.GetProperties().Where(p => p.GetCustomAttribute<NotMappedAttribute>() == null))

它更短,更容易一目了然。