背景
List<Class>
型のコレクションの要素を削除したいんです。
勿論list.Remove~
で削除はできます。
でも、コレクションなんだから、嘗め回しながら要らないものを削除する、ってのが普通の対処方法なんじゃないのかなぁ…
で、
foreach (Class item in list) {
if (なんか条件が合致したら)
list.Remove(item);
}
なんてやったら
ほーら、怒られた…
方法 その①
良くやったのは、一度全体を嘗め回す中で対象を横に退避。
改めて退避リストを参照しながら元リストをメンテナンス。
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
でアクセスする方式。
ただ、頭から処理することができないので、裏から攻めちゃう。
List<Class> list = new List<Class>(); // これが元リスト
list.Add(new Class(~~));
:
for (int i=list.Count-1; i>=0; i--)
if (要らないものが見つかったら)
list.RemoveAt(i);
ですね。
何かちょこっと反則技っぽいニオイが…(別に反則じゃないんですけど)
方法 その③
その①の拡張版と云うか…
元のコレクションを直接メンテナンスできないのなら、複製を渡せばよいのでは?
と急に何かが下りてきたモノ。
List<Class> list = new List<Class>(); // これが元リスト
list.Add(new Class(~~));
:
foreach (Class item in list.ToArray()) // エラーにならないんですよー、これが
if (要らないモンみーつけた)
list.Remove(item);
んー、あっさり。
その①にしたって、結局は複製リストを作成するんだから、③のやり方でもいいよね、きっと。
纏め
まぁ、状況によって使い分けるが吉かと…
ところで折角なので、3の倍数と3が付く数字の時だけ自信がなくなるリスト
を作ってみました。
このコレクションから、件の数字を削除してみましょう。
えーと、まずコレクションに格納するクラスです。
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); }
}
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);
実行するとこんな感じ
じゃぁ、コレクションの部分削除をやってみましょう。
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);
これで、自信が取り戻せました。
ま、根本解決になってない処は目を瞑って頂くと云う事で…