2012-06-03 11 views
5

Jestem całkiem nowy dla C#, proszę bądź łagodny dla mnie, przeszukiwałem sieć przez kilka godzin bez powodzenia, chcę usunąć element z mojej klasy zdefiniowanej przez użytkownika. Jak mam to zrobić?jak usunąć element z listy definiowanej przez użytkownika?

Poniżej znajduje się fragment kodu.

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 

} 

Myślę, że muszę zaimplementować IEnumerable jakiegoś rodzaju, ale jak wygląda składnia? Czy ktoś może podać mi działający fragment? dziękuję

+0

Jaka jest relacja pomiędzy 'ask' i' bid'? Czy mają być tą samą zmienną? – svick

Odpowiedz

9

To usunie wszystkie Level2 obiektów z Price = 300 and Volume = 400 z listy

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

dziękuję bardzo, dokładnie tego potrzebuję:) –

+0

cieszę się, że mogę pomóc; jeśli odpowiedział na twoje pytanie, możesz oznaczyć je jako odpowiedź. –

0

trzeba najpierw pobrać element, który chcesz usunąć:

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

Pamiętaj, że dodajesz instancja objects do listy maszynowy stawkę, więc trzeba szukać listy dla obiektów do usunięcia, które pasują do określonego warunku. Zauważ, że możesz mieć wiele (różnych) instancji Level2 na liście z price==300 i volume==400.

Mała próbka kodu powinna wyjaśnić pewne kwestie.

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

Może się mylę, ale jesteś pewien? Mam na myśli usunięcie przedmiotu z listy, na której trwa iteracja? – Steve

+0

@Steve: masz rację, już zaktualizowałem swoją odpowiedź, ponieważ to wymagało problemów ;-) – ChristopheD

+0

+1, która naprawia wygląda naprawdę lepiej – Steve

1

Oto jak ja to zrobię: przesłonić Equals i GetHashCode na Level2, dzięki czemu można korzystać bez konieczności List<T>.Remove oryginalne odwołanie do obiektu.

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)); 
} 

Oto kolejny sposób, który działa poza tożsamości przedmiotu zamiast wartości wewnątrz niego:

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); 
} 

W zależności od sytuacji, jednym z nich, lub jeden z pozostałych odpowiedzi , może być najlepszym podejściem.

Powiązane problemy