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

セレクターToPredicateはどのように見え、どのように呼び出すのでしょうか?

4

1 に答える 1

2

次のような簡単なことができるように思えます。

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

注意すべき点が1つあります。プロパティが文字列プロパティの場合、空の文字列が返されます。それはあなたが望むものですか?

于 2012-09-04T06:30:04.150 に答える