2013-07-10 6 views
6

Alleggerò solo un'immagine per riferimento su questo. Sono perplesso. Nel debugger i valori sono definitivamente uguali tra loro, ma Find<T> restituisce ancora null e Exists<T> restituisce ancora false. Per riferimento: UserRepository strumenti IEnumerable<T> dove T è DomainUser.List.Find <T>() restituisce null anche se corrispondenza del predicato

Debug screencap

+0

Prova la conversione in un array di byte e di controllo dei byte codici. Sto indovinando uno di loro ha un byte '0' aggiunto. – Alex

risposta

14

Il problema è che il tipo di CommandArgument è object, quindi è l'esecuzione di un controllo d'identità di riferimento. (Sono sorpreso che non si sta dando un avvertimento in fase di compilazione.)

Si potrebbe o lanciare CommandArgument a string, o utilizzare Equals:

u => u.Username == (string) args.CommandArgument 

o

u => Equals(u.Username, args.CommandArgument) 

(L'utilizzo del metodo statico Equals significa che funzionerà anche per gli utenti con un nome utente null, a differenza di u.Username.Equals(args.CommandArgument).)

non vorrei convertire la sequenza per una lista anche se - mi basta usare LINQ invece:

DomainUser toRemove = 
    repo.FirstOrDefault(u => u.Username == (string) args.CommandArgument); 
+0

Grazie per aver sottolineato che posso usare 'FirstOrDefault' senza chiamare' ToList'. Immagino di aver visto solo il tipo di 'CommandArgument' su' Control' (è 'String') e non' RepeaterCommandEventArgs'. – tuespetre

5

Hai provato:

u.Username.Equals(args.CommandArgument) 
Problemi correlati