6

私は 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 を実装する必要があると思いますが、構文はどのようになりますか? 誰かが私に作業スニペットを教えてもらえますか? どうもありがとう

4

4 に答える 4

10

Level2これにより、すべてのオブジェクトがPrice = 300 and Volume = 400リストから削除されます

ask.RemoveAll(a => a.price == 300 && a.volume == 400);
于 2012-06-03T12:21:56.737 に答える
3

オブジェクトへの元の参照を必要とせずに使用できるように、overrideEqualsGetHashCodeonを使用します。Level2List<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));
}

オブジェクト内の値ではなく、オブジェクトの ID に基づいて動作する別の方法を次に示します。

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

状況に応じて、これらのいずれか、または他の回答のいずれかが最適なアプローチになる場合があります。

于 2012-06-03T12:19:22.007 に答える
1

objects型指定された List bidにインスタンス化されたものを追加していることに注意してください。そのため、特定の条件に一致するオブジェクトをリストから検索して削除する必要があります。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());
    }
}
于 2012-06-03T12:06:26.793 に答える
0

最初に、削除する要素を取得する必要があります。

Level2 element = ask.FirstOrDefault(l => l.price == 300 && l.volume == 400);
if (element != null)
    ask.Remove(element);
于 2012-06-03T12:02:50.693 に答える