Вопрос по arrays, list, c# – Как удалить элемент из списка пользовательских классов?

5

Я довольно новичок в c #, пожалуйста, будьте осторожны со мной, я безуспешно искал в сети в течение нескольких часов, я хочу удалить элемент из моего пользовательского класса. Как мне это сделать?

ниже приведен фрагмент кода.

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

 }

Я думаю, что мне нужно реализовать IEnumerable, но как выглядит синтаксис? Может кто-нибудь дать мне рабочий фрагмент? большое спасибо

Какова связь междуask а такжеbid? Должны ли они быть одной и той же переменной? svick

Ваш Ответ

4   ответа
9

Это удалит всеLevel2 объекты сPrice = 300 and Volume = 400 из списка

ask.RemoveAll(a => a.price == 300 && a.volume == 400);
Рад, что смог помочь; если он ответил на ваш вопрос, вы можете пометить его как ответ. Prashanth Thurairatnam
Большое спасибо, это именно то, что мне нужно Clayton Leung
0

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

Вот как я это сделаю: переопределитьEquals а такжеGetHashCode наLevel2, так что вы можете использоватьList<T>.Remove без необходимости исходной ссылки на объект.

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

Вот еще один способ, который работает от идентичности объекта, а не от значений внутри него:

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

В зависимости от вашей ситуации, один из них или один из других ответов может быть лучшим подходом.

1

objects в печатный список Ставка, поэтому вам нужно будет найти в вашем списке объекты, чтобы удалить их, которые соответствуют определенному условию. Обратите внимание, что у вас может быть несколько (разных) экземпляровLevel2 в вашем списке сprice==300 а такжеvolume==400.

Небольшой пример кода должен прояснить ситуацию.

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());
    }
}
Возможно, я ошибаюсь, но ты уверен? Я имею в виду удаление элемента из списка, для которого вы выполняете итерацию? Steve
@ Стив: вы правы, я уже обновил свой ответ, так как это напрашивалось на проблемы; -) ChristopheD
+ 1 это исправление выглядит действительно лучше Steve
бесконечно благодарен :) Clayton Leung

Похожие вопросы