0

私はそのような拡張メソッドを作成しようとしました:

using System;
using System.Collections.Generic;
using System.Linq;

namespace CommonLibs.CommonClasses.Extensions
{
    public static class EnumerableExt
    {
        public static IEnumerable<T> DistinctBy<T>(this IEnumerable<T> collection, Func<T, object> keyGroup)
        {
            return from x in collection group x by keyGroup into grp select grp.First();
        }
    }
}

しかし、次のように使用したい場合:

public class PricingCoefficient
{
    public int Id { get; set; }
    public double FootageFrom { get; set; }
    public double? FootageTo { get; set; }
    public decimal? Coefficient { get; set; }
}

pricingCoefficients.DistinctBy(x => new { x.Coefficient, x.FootageFrom, x.FootageTo });

エラーが発生します:

エラー 30 型 'AnonymousType#1' は、ジェネリック型またはメソッド 'CommonLibs.CommonClasses.EnumerableExtensions.DistinctBy(System.Collections.Generic.IEnumerable, System.Func)' の型パラメーター 'TKey' として使用できません。「AnonymousType#1」から「System.IEquatable」への暗黙的な参照変換はありません。

これを拡張メソッドにする方法はありますか?

ありがとう

4

2 に答える 2

2

T2別の type 、 keyselectorが必要で、Func<T, T2> keyGroupそれを次のように呼び出しますkeyGroup(x)

public static IEnumerable<T> DistinctBy2<T,T2>(this IEnumerable<T> collection, Func<T, T2> keyGroup)
{
    return from x in collection group x by keyGroup(x) into grp select grp.First();
}
于 2013-09-20T06:59:59.773 に答える