LoginSignup
34
28

More than 5 years have passed since last update.

Listコレクション内の要素の削除方法 3題

Posted at

背景

List<Class>型のコレクションの要素を削除したいんです。
勿論list.Remove~で削除はできます。

でも、コレクションなんだから、嘗め回しながら要らないものを削除する、ってのが普通の対処方法なんじゃないのかなぁ…

で、

イメージコード
foreach (Class item in list) {
    if (なんか条件が合致したら)
        list.Remove(item);
}

なんてやったら

image

ほーら、怒られた…

方法 その①

良くやったのは、一度全体を嘗め回す中で対象を横に退避。
改めて退避リストを参照しながら元リストをメンテナンス。

その1のリスト
List<Class> list = new List<Class>();     //    こっちが元リスト
list.Add(new Class(~~));
    

List<Class>  save = new List<Class>();    //    こっちは退避リスト

foreach (Class item in list)              //    まず要らないものを洗い出す
    if (要らないものを見つけたら)
        save.Add(item);

foreach (Class item in save)              //    こっちで実際の削除
    list.Remove(item);

こんな感じ。
遠回り感が半端ない。

方法 その②

foreachじゃなくてindexでアクセスする方式。
ただ、頭から処理することができないので、裏から攻めちゃう。

その2のリスト
List<Class> list = new List<Class>();     //    これが元リスト
list.Add(new Class(~~));
    

for (int i=list.Count-1; i>=0; i--)
    if (要らないものが見つかったら)
        list.RemoveAt(i);

ですね。
何かちょこっと反則技っぽいニオイが…(別に反則じゃないんですけど)

方法 その③

その①の拡張版と云うか…
元のコレクションを直接メンテナンスできないのなら、複製を渡せばよいのでは?
と急に何かが下りてきたモノ。

その3のリスト
List<Class> list = new List<Class>();     //    これが元リスト
list.Add(new Class(~~));
    

foreach (Class item in list.ToArray())    //    エラーにならないんですよー、これが
    if (要らないモンみーつけた)
        list.Remove(item);

んー、あっさり。
その①にしたって、結局は複製リストを作成するんだから、③のやり方でもいいよね、きっと。

纏め

まぁ、状況によって使い分けるが吉かと…


ところで折角なので、3の倍数と3が付く数字の時だけ自信がなくなるリストを作ってみました。
このコレクションから、件の数字を削除してみましょう。

えーと、まずコレクションに格納するクラスです。

Nabeatsu.cs
class Nabeatsu {
    public Nabeatsu(int Value) { this.Value = Value; }
    public int Value { get; set; }
    public bool Unconfident { get { return Value % 3 == 0 || Value.ToString().Contains("3"); } }
    public override string ToString() { return string.Format(Unconfident ? "({0,2})" : " {0,2} ", Value); }
}
Program.csの一部
List<Nabeatsu> NabeList = new List<Nabeatsu>();

for(int i = 1; i <= 100; i++)
    NabeList.Add(new Nabeatsu(i));

foreach(Nabeatsu Nabe in NabeList)
    Console.Write("{0} ", Nabe);

実行するとこんな感じ

image



じゃぁ、コレクションの部分削除をやってみましょう。

Program.csの一部
List<Nabeatsu> NabeList = new List<Nabeatsu>();

for(int i = 1; i <= 100; i++)
    NabeList.Add(new Nabeatsu(i));

foreach(Nabeatsu Nabe in NabeList.ToArray())        //    これで自信がない処を削除
    if(Nabe.Unconfident)
        NabeList.Remove(Nabe);

foreach(Nabeatsu Nabe in NabeList)
    Console.Write("{0} ", Nabe);

image

これで、自信が取り戻せました。
ま、根本解決になってない処は目を瞑って頂くと云う事で…

34
28
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
28