2012-06-03 24 views
5

Soy bastante nuevo en C#, por favor sé amable conmigo, he estado buscando a través de la red durante unas horas sin éxito, quiero eliminar un elemento de mi clase definida por el usuario. ¿Cómo lo hago?cómo eliminar un elemento de una lista de clase definida por el usuario?

a continuación es el fragmento del código.

public class Level2 
{ 
    public double price { get; set; } 
    public long volume { get; set; } 

    public Level2(double price, long volume) 
    { 
     this.price = price; 
     this.volume = volume; 
    } 
} 

static void Main() 
{ 

    List<Level2> bid = new List<Level2>(); 

    ask.Add(new Level2(200, 500)); 
    ask.Add(new Level2(300, 400)); 
    ask.Add(new Level2(300, 600)); 


    // how to remove this element ??? 
    ask.Remove(300, 400);  //doesn't work 

} 

Creo que necesito implementar IEnumerable de algún tipo, pero ¿cómo se ve la sintaxis? ¿alguien puede darme un fragmento de trabajo? muchas gracias

+0

¿Cuál es la relación entre '' ask' y bid'? ¿Se supone que son la misma variable? – svick

Respuesta

9

Esto eliminará todos los objetos con Level2Price = 300 and Volume = 400 de la lista

ask.RemoveAll(a => a.price == 300 && a.volume == 400); 
+0

muchas gracias, esto es exactamente lo que necesito:) –

+0

me alegro de poder ayudarlo; si respondió tu pregunta, puedes marcarla como la respuesta. –

0

Es necesario recuperar primero el elemento que desea eliminar:

Level2 element = ask.FirstOrDefault(l => l.price == 300 && l.volume == 400); 
if (element != null) 
    ask.Remove(element); 
1

Recuerde que está agregando ejemplarizado objects a lista de mecanografiada oferta, por lo que es necesario buscar su lista para objetos para eliminar que coincidan con una determinada condición. Tenga en cuenta que puede tener varias instancias (diferentes) de Level2 en su lista con price==300 y volume==400.

Una pequeña muestra de código debería aclarar las cosas.

public class Level2 
{ 
    public double price { get; set; } 
    public long volume { get; set; } 
    public Level2(double price, long volume) 
    { 
     this.price = price; 
     this.volume = volume; 
    } 
    public override string ToString() 
    { 
     return String.Format("Level 2 object with price: {0} and volume: {1}", 
      this.price, this.volume); 
    } 
} 

public static void Main() 
{ 
    List<Level2> bid = new List<Level2>(); 
    bid.Add(new Level2(200, 500)); 
    bid.Add(new Level2(300, 400)); 
    bid.Add(new Level2(300, 600)); 
    bid.Add(new Level2(300, 400)); // second item with these quantities 

    List<Level2> toRemove = 
     bid.Where(x => x.price == 300 && x.volume == 400).ToList<Level2>(); 

    foreach (Level2 item in toRemove) 
    { 
     bid.Remove(item); 
     Console.WriteLine("removing " + item.ToString()); 
    } 
} 
+0

Quizás estoy equivocado, pero ¿estás seguro? Me refiero a eliminar un elemento de la lista donde está iterando? – Steve

+0

@Steve: tienes razón, ya actualicé mi respuesta ya que estaba buscando problemas ;-) – ChristopheD

+0

+1 esa corrección se ve realmente mejor – Steve

1

Así es como yo lo haría: anula Equals y GetHashCode en Level2, por lo que se puede utilizar sin necesidad de List<T>.Remove la referencia original al objeto.

public class Level2 
{ 
    public double price { get; set; } 
    public long volume { get; set; } 

    public Level2(double price, long volume) 
    { 
     this.price = price; 
     this.volume = volume; 
    } 

    public override bool Equals(object obj) 
    { 
     var other = obj as Level2; 
     if (other == null) 
      return false; 
     return other.price == this.price && other.volume == this.volume; 
    } 

    public override int GetHashCode() 
    { 
     return price.GetHashCode()^volume.GetHashCode(); 
    } 
} 

static void Main(string[] args) 
{ 
    List<Level2> ask = new List<Level2>(); 

    ask.Add(new Level2(200, 500)); 
    ask.Add(new Level2(300, 400)); 
    ask.Add(new Level2(300, 600)); 

    ask.Remove(new Level2(300, 400)); 
} 

Ésta es otra manera, que trabaja fuera de la identidad del objeto en lugar de los valores dentro de ella:

static void Main(string[] args) 
{ 
    List<Level2> ask = new List<Level2>(); 

    ask.Add(new Level2(200, 500)); 
    var level = new Level2(300, 400); 
    ask.Add(level); 
    ask.Add(new Level2(300, 600)); 

    ask.Remove(level); 
} 

Dependiendo de su situación, uno de éstos, o una de las otras respuestas , puede ser el mejor enfoque.

Cuestiones relacionadas