سؤال

ولدي هذا

 var n = ItemList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList();
 n.AddRange(OtherList.Select(s => new { s.Vchr, s.Id, s.Ctr, s.Vendor, s.Description, s.Invoice }).ToList(););

وأود أن تفعل هذا إذا كان حيث سمح

n = n.Distinct((x, y) => x.Vchr == y.Vchr)).ToList();

وحاولت استخدام LambdaComparer لكن منذ ايم باستخدام أنواع مجهولة لا يوجد اي نوع ربطه.

و"ساعدني أوبي وان كنبى، وكنت أملي الوحيد"

هل كانت مفيدة؟

المحلول

وهو خدعة لإنشاء المقارن الذي يعمل فقط على أنواع الاستدلال. على سبيل المثال:

public class Comparer<T> : IComparer<T> {
  private Func<T,T,int> _func;
  public Comparer(Func<T,T,int> func) {
    _func = func;
  }
  public int Compare(T x,  T y ) {
    return _func(x,y);
  }
}

public static class Comparer {
  public static Comparer<T> Create<T>(Func<T,T,int> func){ 
    return new Comparer<T>(func);
  }
  public static Comparer<T> CreateComparerForElements<T>(this IEnumerable<T> enumerable, Func<T,T,int> func) {
    return new Comparer<T>(func);
  }
}

والآن أستطيع أن أفعل ما يلي ... حل hacky:

var comp = n.CreateComparerForElements((x, y) => x.Vchr == y.Vchr);

نصائح أخرى

ومعظم الوقت عند مقارنة (من أجل المساواة أو الفرز) كنت ترغب في اختيار مفاتيح والمقارنة بينها حسب، وليس المساواة أو المقارنة الأسلوب نفسه (هذه هي الفكرة وراء API القائمة نوع بايثون).

وهناك مثال مفتاح المساواة المقارن هنا .

وألاحظ أن الجواب JaredPar للا يجيب تماما السؤال منذ الأساليب مجموعة متميزة مثل وباستثناء تتطلب IEqualityComparer<T> يست IComparer<T>. يفترض ما يلي أن IEquatable سيكون لها GetHashCode مناسبة، وبالتأكيد لديه مناسبة يساوي الأسلوب.

public class GeneralComparer<T, TEquatable> : IEqualityComparer<T>
{
    private readonly Func<T, IEquatable<TEquatable>> equatableSelector;

    public GeneralComparer(Func<T, IEquatable<TEquatable>> equatableSelector)
    {
        this.equatableSelector = equatableSelector;
    }

    public bool Equals(T x, T y)
    {
        return equatableSelector.Invoke(x).Equals(equatableSelector.Invoke(y));
    }

    public int GetHashCode(T x)
    {
        return equatableSelector(x).GetHashCode();
    }
}

public static class GeneralComparer
{
    public static GeneralComparer<T, TEquatable> Create<T, TEquatable>(Func<T, TEquatable> equatableSelector)
    {
        return new GeneralComparer<T, TEquatable>(equatableSelector);
    }
}

وأين يستخدم نفس الاستدلال من خدعة فئة ثابتة كما هو الحال في الجواب JaredPar ل.

لتكون أكثر عمومية كنت يمكن أن توفر اثنين Funcs: أ Func<T, T, bool> للتحقق المساواة وFunc<T, T, int> لاختيار رمز التجزئة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top