Remplacer un élément de la collection à l'aide de Linq
Comment puis-je rechercher et remplacer une propriété à l'aide de Linq dans ce scénario spécifique ci-dessous:
public interface IPropertyBag { }
public class PropertyBag : IPropertyBag
{
public Property[] Properties { get; set; }
public Property this[string name]
{
get { return Properties.Where((e) => e.Name == name).Single(); }
//TODO: Just copying values... Find out how to find the index and replace the value
set { Properties.Where((e) => e.Name == name).Single().Value = value.Value; }
}
}
Merci pour votre aide à l'avance.
Ce PropertyBag utilisez-vous? Je ne pense pas qu'il y en a un dans le .Net BCL. Je demande cela parce que les "Propriétés" de lecture est probablement le seul à faire le clonage, d'où la raison pourquoi vous ne pouvez pas faire ce que vous voulez.
Jonathan, c'est mon propre PropertyBag classe.. Le code ci-dessus fonctionne, parce que je ne suis pas le remplacement de l'intégralité de l'article dans la Propriété tableau []. Le commentaire dans le code illustre le fait que l': //TODO: il suffit de copier les valeurs... de savoir comment trouver l'index et remplacer la valeur
Me demandais pourquoi vous n'avez pas à utiliser mon LINQ-gratuit IndexOf() solution ... maintenant je sais! J'ai corrigé ma réponse par exemple à la méthode statique.
Jonathan, c'est mon propre PropertyBag classe.. Le code ci-dessus fonctionne, parce que je ne suis pas le remplacement de l'intégralité de l'article dans la Propriété tableau []. Le commentaire dans le code illustre le fait que l': //TODO: il suffit de copier les valeurs... de savoir comment trouver l'index et remplacer la valeur
Me demandais pourquoi vous n'avez pas à utiliser mon LINQ-gratuit IndexOf() solution ... maintenant je sais! J'ai corrigé ma réponse par exemple à la méthode statique.
OriginalL'auteur Vyas Bharghava | 2009-04-14
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser LINQ, car il ne va pas améliorer le code, parce que LINQ est conçu à la requête de la collection et de ne pas les modifier. Je suggère ce qui suit.
Pourquoi sont Array.Sort() et de la Matrice.IndexOf() les méthodes statiques?
De plus, je suggère de ne pas utiliser un tableau. Pensez à utiliser
IDictionary<String, Property>
. Cela simplifie le code de la manière suivante.Noter que ni la solution est thread-safe.
Ad hoc LINQ solution - voyez-vous, vous ne devriez pas l'utiliser parce que l'ensemble de la matrice sera remplacé par un nouveau.
Clearified le point.
Malheureusement, à l'aide de [I]Dicitonary n'est pas l'option qu'il n'est pas sérialisable... Avoir à laisser un tableau... ouais... IndexOf() semble une solution raisonnable... mais j'étais juste en espérant peut-être que je faisais quelque chose de mal et il n'y a en effet une façon de Linq pour ce faire...
Dictionnaire<K,V> est Sérialisable....
La Sérialisation XML?
OriginalL'auteur Daniel Brückner
[note: cette réponse est due à une incompréhension de la question - voir les commentaires sur cette réponse. Apparemment, je suis un peu dense :(]
Est votre "Propriété" d'une classe ou d'une structure (struct)?
Ce test passe pour moi:
Je me demande pourquoi la lecture renvoie une "Propriété" à la place de ce type de données .Valeur, mais je suis toujours curieux de savoir pourquoi vous voyez un résultat différent de ce que je suis.
Et c'est Jonathan, je ne vous remercie de prendre le temps de les aider. Pas un ingrat moron, à vous de voir... 🙂
Pourriez-vous coller en plus de votre code alors? Le code que j'ai posté a fonctionné pour moi, et c'est la seule chose que je peux penser de le faire fonctionner comme vous le décrivez.
Le point est le suivant: "[...]Seul().Valeur = valeur.Valeur;" met juste à jour la valeur de la propriété, mais ne remplace pas la propriété de l'objet dans le tableau avec celle fournie. Cela nécessiterait quelque chose comme "[...]Seul() = valeur;". Obvisiously cela ne fonctionne pas - LINQ ne prend pas en charge
modification de la collecte. Vous avez à construire une nouvelle et remplacement de l'ancien, avec qui - voir l'exemple dans ma réponse mais ce n'est pas une solution intelligente.
OriginalL'auteur Jonathan Rupp