C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 配列内のクラス検索


(過去ログ 109 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■65008 / inTopicNo.1)  配列内のクラス検索
  
□投稿者/ howling (169回)-(2013/01/29(Tue) 14:46:34)

分類:[.NET 全般] 

お世話になっております。

Windows7 C# VS2010での質問になるのですが、

とある1個名前を持つクラスを定義し、
このクラスのリストをどこかで持ちます。
このリストに対して新しくクラスを追加する場合に、
同名の物があるかどうかのチェックを行いたいのですが、
foreachで毎度やっているのは遅いのではないか?と思いました。
何か良い方法はありませんでしょうか。

public class SomeClass
{
    public string ThisName{ get; set; }
}

public class ListClass
{
    ArrayList SomeClassArray = new ArrayList();
    public void AddData(SomeClass clsAddData)
    {
        if(SomeClassArray.Contains(clsAddData) == false)
        SomeClassArray.Add(clsAddData); //これだけだとインスタンスが異なるのであれば、名前がかぶってしまう
    }
}

以上
宜しくお願い致します。

引用返信 編集キー/
■65009 / inTopicNo.2)  Re[1]: 配列内のクラス検索
□投稿者/ shu (157回)-(2013/01/29(Tue) 16:03:46)
No65008 (howling さん) に返信

やりたいことと合っているか分かりませんが

Dictionaryを使用されるとよいのではないでしょうか?ArrayListはあまり使わない方がよいと思います。
SomeClassのスタティックメソッドはインスタンス作成を簡単に書くため追加したものです。実際はなくても
よいです。

定義:
	public class SomeClass
	{
		public static SomeClass New(string ThisName)
		{
			SomeClass ret = new SomeClass();
			ret.ThisName = ThisName;
			return ret;
		}

		public string ThisName { get; set; }
	}

	public class ListClass:Dictionary<string,SomeClass>
	{
		public void AddData(SomeClass Data)
		{
			if (!this.ContainsKey(Data.ThisName))
			{
				this.Add(Data.ThisName, Data);
			}
		}
	}

呼出サンプル:
ListClass lst = new ListClass();
lst.AddData(SomeClass.New("a"));
lst.AddData(SomeClass.New("b"));
lst.AddData(SomeClass.New("c"));
lst.AddData(SomeClass.New("a"));
lst.AddData(SomeClass.New("d"));
lst.AddData(SomeClass.New("e"));
lst.AddData(SomeClass.New("b"));

foreach (var itm in lst)
{
	Console.WriteLine(itm.Key);
}

引用返信 編集キー/
■65013 / inTopicNo.3)  Re[2]: 配列内のクラス検索
□投稿者/ howling (170回)-(2013/01/29(Tue) 17:44:37)
No65009 (shu さん) に返信
ご返信ありがとうございます。

やっぱりDictionaryを使った方が良いんですね。
使うと相当速くなると書いてあったのですが、
どうにも使い方がよくわからず、困っていた感じでした。
(速度計測のサイトが多い感じでした)

使用回数が多い部分はこういった形に差し替えようと思います。
ソースも作成して頂き、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -