■ Listについて、あれこれ
ArrayListについて
* .NET 2.0以前は、ArrayListしかなかった。 * ArrayListは、object型のデータが入るので何でも入れられるが、取り出すときにキャストする必要がある * 間違ってキャストすると例外で落ちるが、コンパイル時には発見し辛いのでやっかい。 →ゆえに、「ジェネリック List<T>」を使いましょ。
■ リスト要素内に特定のデータがあるかどうか判定する
* Any()を使う * Any()については、以下を参照のことhttps://blogs.yahoo.co.jp/dk521123/20248181.html
■ リスト要素内に指定した値が存在しているかどうか
* Exists()を使う * Contains()の方がいいかも...
サンプル
* 単語が母音だったら「An」それ以外なら「A」を付加して表示する * 正規表現やstring.StartsWith()でもできると思うけど...https://blogs.yahoo.co.jp/dk521123/8566072.html
private void button1_Click(object sender, EventArgs e) { List<char> list = new List<char>() { 'A', 'a', 'I', 'i', 'U', 'u', 'E', 'e', 'O', 'o', }; if (!char.IsLetter(this.textBox1.Text[0])) { this.label1.Text = "アルファベットじゃないです"; } else if (list.Exists(x => x == this.textBox1.Text[0])) { this.label1.Text = "A " + this.textBox1.Text; } else { this.label1.Text = "An " + this.textBox1.Text; } }
■ ReadOnlyのリストを作成する
* Array.AsReadOnly()を使用する
サンプル
Form1.csprivate void button1_Click(object sender, EventArgs e) { var list = Array.AsReadOnly( new double[] { 3.0, 2.0, 3.0, 3.0, 3.0, 4.0 }); var obj = new Average(); string text = string.Empty; foreach (var data in list) { text = text + " " + this.obj.Calculate(data).ToString(); } this.label1.Text = text; }Average.cs
public class Average { private IList<double> dataList; public Average() { this.dataList = new List<double>(); } public double Calculate(double data) { this.dataList.Add(data); double average; if (this.dataList.Count < 3) { return double.NaN; } else if (this.dataList.Count > 3) { this.dataList.RemoveAt(0); } double sum = 0; foreach (var tempData in this.dataList) { sum = sum + tempData; } average = sum / this.dataList.Count; return average; } }
■ リスト要素を削除する
* RemoveAll()を使う
サンプル
* Any()、RemoveAll()を使ったサンプルpublic class Person { public string Id { get; set; } public string Name { get; set; } public int Age { get; set; } } private void button1_Click(object sender, EventArgs e) { List<Person> list = new List<Person>() { new Person() {Id = "001", Name = "Mike", Age = 22, }, new Person() {Id = "002", Name = "Sam", Age = 18, }, new Person() {Id = "xxx", Name = "Tom", Age = 32, }, }; if (list.Any(x => x.Id == this.textBox1.Text)) { list.RemoveAll(x => x.Id == this.textBox1.Text); this.label1.Text = "Id : " + this.textBox1.Text + " を削除しました"; } else { this.label1.Text = "そんなデータない"; } this.dataGridView1.DataSource = list; }
■ List同士をマージ(連結)する
* AddRange()を使うhttp://msdn.microsoft.com/ja-jp/library/z883w3dc(v=vs.80).aspx
サンプル
Personクラスは、「リスト要素を削除する」の時と同じprivate void button1_Click(object sender, EventArgs e) { var people1 = new List<Person>() { new Person() {Id = "001", Name = "Mike", Age = 22, }, new Person() {Id = "002", Name = "Sam", Age = 18, }, new Person() {Id = "004", Name = "Tom", Age = 32, }, }; var people2 = new List<Person>() { new Person() {Id = "003", Name = "John", Age = 43, }, new Person() {Id = "005", Name = "Dave", Age = 34, }, new Person() {Id = "006", Name = "Kite", Age = 27, }, }; people1.AddRange(people2); var output = string.Empty; foreach(var person in people1) { output = output + person.Id.ToString() + " " + person.Name + "(" + person.Age.ToString() + ")" + System.Environment.NewLine; } this.label1.Text = output; }
■ 重複する要素を取り除く
* Distinct()を使う
サンプル
List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 }; List<int> distinctAges = ages.Distinct().ToList();
■ 条件付きでリストのインデックスを取得
* FindIndex()を使用する
サンプル
List<Person> list = new List<Person>() { new Person() {Id = "001", Name = "Mike", Age = 22, }, new Person() {Id = "002", Name = "Sam", Age = 18, }, new Person() {Id = "xxx", Name = "Tom", Age = 32, }, }; int index = list.ToList().FindIndex(x => x.Id == "xxx");
関連記事
C# / コレクション
Dictionary (ディクショナリ)https://blogs.yahoo.co.jp/dk521123/21978660.html
Concurrentコレクション ~ スレッドセーフなコレクション ~
https://blogs.yahoo.co.jp/dk521123/38017014.html
BlockingCollection ~ Producer-Consumerパターン ~
https://blogs.yahoo.co.jp/dk521123/37943991.html