2012-09-04 34 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. –