2012-09-04 33 views
0

我正在搜索特定属性的对象列表。我重复了很多属性的代码,所以我试图尽可能的使这些属性的读取更紧凑。搜索非空属性的对象列表

这是我目前有:

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

在你的评论中,你表明你想要与默认(T)进行比较,为什么你不这样做?即'predicate = p => selector(p).equals(default(T))' – Iain

+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)); 
} 

有一点要注意 - 如果你的财产是一个字符串属性,这返回空字符串。那是你要的吗?

+0

看来,它不是因为他检查int值为0不是NULL,但 – vittore

+0

其实,我可能不得不避免空字符串。我可以使用专门的功能吗?我在.NET 4. –

+0

@vittore:我假设'ProductCatalogId'是一个'int'属性,'default(int)'是0. –