Howto remplacer List<T> Contient
Je veux comparer une propriété au lieu de la totalité de l'objet à l'aide d'une Liste[MyObject]. J'ai donc utiliser IEquatable[MyObject] mais le compilateur veut toujours MyObject au lieu de la chaîne de propriété. Pourquoi?
Voici ce que j'ai:
public class AnyClass
{
public List<AnyOtherClass> MyProperty { get; set; }
public string AnyProperty { get; set; }
public AnyClass(string[] Names, string[] Values, string AnyProperty)
{
this.AnyProperty = AnyProperty;
this.MyProperty = new List<AnyOtherClass>();
for (int i = 0; i < Names.Length; i++)
MyProperty.Add(new AnyOtherClass(Names[i], Values[i]));
}
}
public class AnyOtherClass : IEquatable<string>
{
public AnyOtherClass(string Name, string Values)
{
this.Name = Name;
this.Values = Values.Split(';').ToList();
}
public string Name { get; set; }
public List<string> Values { get; set; }
public bool Equals(string other)
{
return this.Name.Equals(other);
}
}
private void DoSomething()
{
string[] Names = new string[] { "Name1", "Name2" };
string[] Values = new string[] { "Value1_1;Value1_2", "Value2" };
AnyClass ac = new AnyClass(Names, Values, "any Property");
if (ac.MyProperty.Contains("Name1")) //Problem is here...
//do something
}
OriginalL'auteur UNeverNo | 2012-12-03
Vous devez vous connecter pour publier un commentaire.
Vous voudrez peut-être essayer d'utiliser ce :
à partir de MSDN : http://msdn.microsoft.com/en-us/library/bb534972.aspx
La
x => x.someProperty == someValue
est appelé unlambda expression
dans le cas où vous ne le saviez pas.Et notez que vous pouvez utiliser ce sur quoi que ce soit la mise en œuvre de
IEnumerable
, de sorte que de ne pas vous limiter àList<T>
.Any
va cesser de l'évaluation lors de la première correspondance est trouvée, alors queWhere
va continuer pour obtenir une liste complète (et potentiellement prendre beaucoup plus de temps à s'exécuter).Bon, je vais la tête pour l'utilisation de LINQ ici.
OriginalL'auteur Pacane
semble que vous devriez faire un
Where
plutôt qu'unContains
La raison
ac.MyProperty.Contains("Name1")
souffle est parce queMyProperty
est unList<AnyOtherClass>
et pas unstring
+1 juste parce que on dirait que vous devriez faire une Où plutôt que de l'une Contient phrase m'ont beaucoup aidé!
OriginalL'auteur hunter
Il devrait être
IEquatable<AnyOtherClass>
pas<string>
. Vous comparez les instances deAnyOtherClass
pas les instances deString
, malgré le fait que votre comparaison est en fait de la comparaison de chaînes au sein de votre classe.Mais il ressemble plus à ce que vous essayez de faire est de faire une sorte de dictionnaire. Dans ce cas, vous devez utiliser le dictionnaire des classes.
Ce n'est pas ce que l'
IEquatable
interface est pour. C'est pour comparer des objets de la type. Comme je l'ai dit avant, il semble que vous recherchez n'est pas unList<AnyOtherClass>
mais unDictionary<string,AnyOtherClass>
.OriginalL'auteur Matt Burland
Qui n'est pas le but de l'utilisation de IEquatable<T>. Regardez la documentation http://msdn.microsoft.com/en-us/library/ms131187.aspx:
Notes afférentes aux maîtres d'œuvre
Remplacez le paramètre de type de la IEquatable<T> interface avec le type qui implémente cette interface.
D'ailleurs pas conçu pour fonctionner comme ça, pourquoi voudriez-vous la force d'une mise en œuvre d'égal à égal sur une classe d'une autre classe a une exigence spécifique sur la recherche jusqu'instances? Laisser jusqu'à la classe de tenue de la collection de faire la fonction de clé de recherche comme décrit dans d'autres réponses.
OriginalL'auteur fsimonazzi