0

次のコードと同じ結果を得るために単一の LINQ 式を記述する方法はありますか?

        var validations = new Func<conversion, bool>[] { 
             c => c.affiliate.affiliate_id > 0,
             c => c.campaign_id > 0
        }; 

        var invalidConversions = from c in extractedConversions
                                 where validations.Any(valid => !valid(c))
                                 select c;

        var validConversions = from c in extractedConversions
                               where validations.All(valid => valid(c))
                               select c;
4

2 に答える 2

4

次のようなものを使用できます。

var partitioned = extracted.ToLookup(c => validations.All(valid => valid(c)));

それで:

// Valid conversions
foreach (var valid in partitioned[true])
{
}

// Invalid conversions
foreach (var invalid in partitioned[false])
{
}

GroupBy同様に使用できますがToLookup、結果をすぐに具体化し、それらにアクセスする便利な方法を提供します。これが、ここで必要なものだと思います。

于 2012-06-26T19:50:35.247 に答える
1

conversionクラスにオーバーライドがEqualsあり、次のことができる場合GetHashCodeがあります。

var validations = new Func<conversion, bool>[] {
   c => c.affiliate.affiliate_id > 0,
   c => c.campaign_id > 0
};

var invalidConversions =
    from c in extractedConversions
    where validations.All(valid => !valid(c))
    select c;

var validConversions =
    extractedConversions.Except(invalidConversions);
于 2012-06-26T19:52:48.563 に答える