2 votes

comment utiliser linq pour obtenir l'emplacement de la mémoire ?

J'ai une liste et j'essaie de trouver un élément particulier, puis je veux modifier cet élément.

storage.First(item => item.dirty == true).dirty = false; 

Cependant, cela ne semble pas fonctionner puisque je suppose que First crée une autre liste et l'alimente. Existe-t-il une fonction permettant de faire ce que j'essaie de faire ?

Voici le type de données que j'utilise :

class BaseRegister {
  public bool dirty {set;get;}
}

List <BaseRegister> storage = new List <BaseRegister> ();

4voto

Reed Copsey Points 315315

Cela fonctionnera, mais seulement si votre type (qui contient .dirty ) est une classe.

S'il s'agit d'un struct, vous ne pourrez pas le modifier de cette façon. Dans le cas d'un struct, vous devrez remplacer l'ensemble du struct dans la collection, ce qui est très difficile avec les extensions LINQ, car elles sont conçues pour les requêtes et non pour les modifications.

Si le type (de storage ) met en œuvre IList<T> comme List<YourClass> vous pourriez utiliser :

int index = storage.FindIndex(item => item.dirty);
var item = storage[index];
item.dirty = false;
storage[index] = item;

Notez que c'est désordonné, mais surtout parce qu'il faut réinitialiser complètement la valeur de la structure dans la liste.

C'est en partie pourquoi les structures mutables sont une mauvaise idée. Si vous trouvez que c'est un modèle dont vous pensez avoir besoin avec votre type, vous pouvez envisager une classe. En général, tout élément qui va avoir un drapeau "dirty" est probablement mutable, et en tant que tel, devrait être une classe et non une structure.

2voto

Corey Kosak Points 1957

Il doit y avoir un autre problème dans votre programme qui vous perturbe. Pour éviter tout doute, voici un programme complet utilisant vos types de données. La sortie est :

---Before---
True
False
True
---After---
False
False
True

Le code est :

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace ConsoleApplication40 {
  internal class Program {
    private static List<BaseRegister> storage=new List<BaseRegister>();

    private static void Main(string[] args) {
      storage.Add(new BaseRegister {dirty=true});
      storage.Add(new BaseRegister {dirty=false});
      storage.Add(new BaseRegister {dirty=true});
      Dump("---Before---");
      storage.First(item => item.dirty==true).dirty=false;
      Dump("---After---");
    }

    private static void Dump(string title) {
      Debug.WriteLine(title);
      foreach(var br in storage) {
        Debug.WriteLine(br.dirty);
      }
    }

    private class BaseRegister {
      public bool dirty { set; get; }
    }
  }
}

0voto

CodesInChaos Points 60274

Si l'élément est un type de référence, cela devrait modifier la valeur de l'élément. dirty propriété/champ.

Si l'élément est un type de valeur, First renvoie une copie, et cela ne devrait même pas compiler.

First ne crée pas une liste, il renvoie le premier élément de la séquence qui remplit la condition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X