Domanda

Ho questo

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

Vorrei fare questo se si dove consentito

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

Ho provato ad utilizzare il LambdaComparer ma dal momento che im utilizzando tipi anonimi non v'è alcun tipo associarlo.

"Aiutami Obi Wan Kenobi, sei la mia unica speranza"

È stato utile?

Soluzione

Il trucco è quello di creare un operatore di confronto che funziona solo sui tipi di dedurre. Per esempio:

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

Ora posso effettuare le seguenti operazioni ... soluzione hacky:

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

Altri suggerimenti

La maggior parte del tempo in cui si confronta (per l'uguaglianza o l'ordinamento) siete interessati nella scelta delle chiavi per confrontare da, non il metodo uguaglianza o confronto per sé (questo è l'idea alla base elenco di ordinamento API di Python).

C'è un esempio chiave di uguaglianza di confronto qui .

Ho notato che la risposta di JaredPar non abbastanza rispondere alla domanda in quanto i metodi set come distinto e Salvo richiederebbe un IEqualityComparer<T> non un IComparer<T>. Di seguito si presuppone che un IEquatable avrà un GetHashCode adatto, ed ha certamente un adeguato metodo Equals.

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

Se la stessa inferenza da un trucco classe statica viene utilizzata come in risposta di JaredPar.

Per essere più generale, si potrebbe fornire due Func s:. Un Func<T, T, bool> per verificare l'uguaglianza e Func<T, T, int> per selezionare un codice hash

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top