Quando ho 2 oggetti List<string>
, quindi posso utilizzare direttamente Intersect
e Except
per ottenere un'uscita IEnumerable<string>
. È abbastanza semplice, ma cosa succede se voglio l'intersezione/disgiunzione su qualcosa di più complesso?Utilizzo di LINQ per oggetti Interseca e Tranne su una proprietà specifica
Esempio, cercando di ottenere un insieme di oggetti ClassA
che è il risultato della Intersect sul ClassA
di AStr1
dell'oggetto e ClassB
oggetto di BStr
; :
public class ClassA {
public string AStr1 { get; set; }
public string AStr2 { get; set; }
public int AInt { get; set; }
}
public class ClassB {
public string BStr { get; set; }
public int BInt { get; set; }
}
public class Whatever {
public void xyz(List<ClassA> aObj, List<ClassB> bObj) {
// *** this line is horribly incorrect ***
IEnumberable<ClassA> result =
aObj.Intersect(bObj).Where(a, b => a.AStr1 == b.BStr);
}
}
Come posso fissare la linea annotata per ottenere questa intersezione.
Ciao @ Jon Skeet, non capisco come posso passare il quarto parametro. Sono in grado di definire una classe implementando IEqualityComparer e quindi passare un'istanza di questa classe? – corei11
@ corei11: Sì, se hai bisogno di qualcosa di personalizzato - o usa 'EqualityComparer .Default' se sei soddisfatto dell'operazione di uguaglianza predefinita. –
Grazie a @Jon Skeet. Qui ho due 'IEnumerable owner1' e' owner2'. E definisco una classe chiamata 'Compar' implementando' IEqualityComparer'. Ora chiama il metodo in questo modo 'owner1 = owner1.IntersectBy (owner2, item => item.Email_Address, new Compar())'. In realtà voglio chiarire che come passare la mia classe Compar. Quello che scrivo direttamente è una stringa o c'è un altro modo migliore o il mio approccio è ok? Il mio prototipo di classe Compar è 'public class Compar : IEqualityComparer '. Scusate. Potrebbe essere una domanda sciocca. Grazie. –
corei11