搜索非空属性的对象列表

时间:2012-09-04 06:24:42

标签: c# linq

我正在搜索某个属性的对象列表。我正在为很多属性重复这段代码,所以我试图让属性的读取尽可能紧凑。

以下是我目前的情况:

value = ReadValue(p => p.ProductCatalogId != 0, p => p.ProductCatalogId);

public T ReadValue<T>(Func<MyType, bool> predicate, Func<MyType, T> selector)
{
    return m_settingsPages.Where(predicate).Select(selector).FirstOrDefault();
}

我总是与该类型的默认值进行比较,并始终用于不等式。我想删除谓词参数。我可以使用部分应用程序或类似技术来摆脱谓词参数吗?

伪代码:

value = ReadFirstValue(p => p.ProductCatalogId);

public T ReadFirstValue<T>(Func<MyType, T> selector) where T : IEquatable<T>
{
    var predicate = selectorToPredicate(selector); //Compare with default(T) for non equality
    return m_settingsPages.Where(predicate).Select(selector).FirstOrDefault();
}

selectorToPredicate将如何显示以及如何调用它?

1 个答案:

答案 0 :(得分:2)

听起来你可以做一些简单的事情:

Func<MyType, bool> SelectorToPredicate<T>(Func<MyType, T> selector)
{
    EqualityComparer<T> comparer = EqualityComparer<T>.Default;
    return x => !comparer.Equals(selector(x), default(T));
}

有一点需要注意 - 如果您的属性是字符串属性,则此返回空字符串。这就是你想要的吗?