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

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

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

Re[5]: ArrayListでの文字列検索


(過去ログ 48 を表示中)

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

■26035 / inTopicNo.1)  ArrayListでの文字列検索
  
□投稿者/ やきいも (1回)-(2008/09/30(Tue) 20:12:29)

分類:[C#] 

VC2003、C#のwindowsアプリを作成しています。
ArrayListに文字列を入れ、文字列内にある文字列があるかないかを
検出したいのですが、よいメソッドがなかったためできませんでした。
近いかなと思ったメソッドで試したりもしたのですがうまくいきませんでした。

static public ArrayList array1 = new ArrayList();
static public ArrayList array2 = new ArrayList();


for(int i=0; i<array1.Count; ++i)
{
bool isequal = array1[i].Equals("aa");
if(isequal)
{
array2.Add(array1); // "aa"を含む文字列があれば格納
}
}

このほかに良い方法などがあれば教えていただければと思います。
よろしくお願い致します。
引用返信 編集キー/
■26036 / inTopicNo.2)  Re[1]: ArrayListでの文字列検索
□投稿者/ ぽぴ王子 (397回)-(2008/09/30(Tue) 20:24:04)
ぽぴ王子 さんの Web サイト
No26035 (やきいも さん) に返信

> VC2003、C#のwindowsアプリを作成しています。

VC2003 というプロダクトは存在しないと思います。

> ArrayListに文字列を入れ、文字列内にある文字列があるかないかを
> 検出したいのですが、よいメソッドがなかったためできませんでした。

「あるかないか」を調べるんですよね?
ソースを見る限りでは、一致するものをすべて array2 に追加していっている
ように見受けられます。
どっちなのでしょう?

「あるかないか」を調べるだけなら

■ ArrayList.Contains メソッド
http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.contains.aspx

■ ArrayList.IndexOf メソッド
http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.indexof%28VS.80%29.aspx

が使えると思います。
そうでなければ、やきいもさんが書かれた方法で。
(なぜ Equals を使うのかとか isequal が IsEqual ではなく全部小文字なのかは疑問ですけど)

> 近いかなと思ったメソッドで試したりもしたのですがうまくいきませんでした。

試したのであれば、その試したメソッドを教えてください。
回答者が調べて回答をしてみたら、実はそのメソッドだったとか、実は使い方が間違って
いただけだったとかあります。
出せる情報はすべて出しておくといいです。
引用返信 編集キー/
■26051 / inTopicNo.3)  Re[2]: ArrayListでの文字列検索
□投稿者/ ま (127回)-(2008/10/01(Wed) 11:11:07)
public class MyArrayList : ArrayList {
   public boolean MatchContains(string s) {
      Regex re = new Regex(s);
      boolean b = false;
      foreach (object o in this) {
          b = re.IsMatch(o.ToString());
          if (b) break;
      }
      return b;
   }
   public overrides boolean Contains(string s) {
      return MatchContains(s);
   }
}

文字列中の文字列だからこんなんじゃない?


引用返信 編集キー/
■26054 / inTopicNo.4)  Re[1]: ArrayListでの文字列検索
□投稿者/ みきぬ (125回)-(2008/10/01(Wed) 11:24:51)
No26035 (やきいも さん) に返信
> このほかに良い方法などがあれば教えていただければと思います。

とあったので、提案などしてみる。

・ArrayListの要素として文字列しか該当しないのであれば、かわりに StringCollection を使うのはどうだろう。
・そうすれば foreach でループさせて、各要素に対して s.IndexOf("aa") != -1 で判定できるんじゃないかなぁ。
引用返信 編集キー/
■26097 / inTopicNo.5)  Re[2]: ArrayListでの文字列検索
□投稿者/ やきいも (2回)-(2008/10/01(Wed) 16:35:41)
No26036 (ぽぴ王子 さん) に返信
> ■No26035 (やきいも さん) に返信
>
>>VC2003、C#のwindowsアプリを作成しています。
>
> VC2003 というプロダクトは存在しないと思います。
>
>>ArrayListに文字列を入れ、文字列内にある文字列があるかないかを
>>検出したいのですが、よいメソッドがなかったためできませんでした。
>
> 「あるかないか」を調べるんですよね?
> ソースを見る限りでは、一致するものをすべて array2 に追加していっている
> ように見受けられます。
> どっちなのでしょう?
>
> 「あるかないか」を調べるだけなら
>
> ■ ArrayList.Contains メソッド
> http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.contains.aspx
>
> ■ ArrayList.IndexOf メソッド
> http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.indexof%28VS.80%29.aspx
>
> が使えると思います。
> そうでなければ、やきいもさんが書かれた方法で。
> (なぜ Equals を使うのかとか isequal が IsEqual ではなく全部小文字なのかは疑問ですけど)
>
>>近いかなと思ったメソッドで試したりもしたのですがうまくいきませんでした。
>
> 試したのであれば、その試したメソッドを教えてください。
> 回答者が調べて回答をしてみたら、実はそのメソッドだったとか、実は使い方が間違って
> いただけだったとかあります。
> 出せる情報はすべて出しておくといいです。

ぽぴ王子 さん、まさん、みきぬさん解答ありがとうございます。
正しくはVisualStudio.NET2003でした。失礼しました。
つまづいているのが文字列を検索するところでしたので、
その後文字列を他のArrayListに入れているところまではいいませんでした。すいません。
近いかなと思ったメソッドですが、Contains(),IndexOf()のことです。

調べて見た結果と、みなさんののヒントからToSring()を使用することで一応やりたいことはできました。

for(int i=0; i<array1.Count; ++i)
{
if( array1[i].ToString().IndexOf("aa") != -1)
{
headerfile.Add(array2[i]);
}
}

しかし、ArrayListで検索する方法がうまくいきません。
例えば、Contains()ですが、

IEnumerator myEnum = headerpass.GetEnumerator();

while( myEnum.MoveNext() )
{

if( array1.Contains("aa") )
{
array2.Add(headerpass);
}
}

のようにやったのですが、うまくいきません。反復子の使い方が悪いのでしょうか?

申し訳ありませんが、こちらについてわかる方がいらっしゃたら
よろしくお願い致します。




引用返信 編集キー/
■26099 / inTopicNo.6)  Re[2]: ArrayListでの文字列検索
□投稿者/ やきいも (3回)-(2008/10/01(Wed) 16:40:07)
前回の投稿ですが誤りがありました。失礼致しました。

違)
IEnumerator myEnum = headerpass.GetEnumerator();

while( myEnum.MoveNext() )
{

if( array1.Contains("aa") )
{
array2.Add(headerpass);  /////ここ
}
}

正)
IEnumerator myEnum = headerpass.GetEnumerator();

while( myEnum.MoveNext() )
{

if( array1.Contains("aa") )
{
array2.Add(array2);    /////ここ
}
}

失礼致しました。よろしくお願いします。

引用返信 編集キー/
■26108 / inTopicNo.7)  Re[3]: ArrayListでの文字列検索
□投稿者/ ま (131回)-(2008/10/02(Thu) 01:08:22)


ん〜、なんだかよくわかんないんだけど、派生クラスのサンプル載せたよね。
ありがとうの謝辞だけで全然見て無いのかな?

ArrayList#IndexOf の文字列検索は完全一致検索です。一致した要素の要素番号
を返すんです。
君の言いたがっている検索は部分一致の検索方法。

お礼だけじゃなくて実際に検討してみるといいね〜。MSDN見ながら誤字脱字の
無いように書いたんだから・・・動かない場合は自分でなんとかして。

if( array1.Contains("aa") ) { }
これを、"aaBBCC" でも "ddffaaGGHH" でもマッチするようにしたいなら
Contains をオーバーライドする必要あるのね。したくないなら、みきぬ
さんの説明をコードにするだけ。

this => this.Items とからんと動かないかも・・・



引用返信 編集キー/
■26109 / inTopicNo.8)  Re[4]: ArrayListでの文字列検索
□投稿者/ ま (132回)-(2008/10/02(Thu) 02:05:54)
No26108 (ま さん) に返信
> 
> 
> ん〜、なんだかよくわかんないんだけど、派生クラスのサンプル載せたよね。

全然違った。;;

C#2005 Express 版のやつでテスト確認。

    class Program
    {
        static void Main(string[] args)
        {
            new Program().test1();
            new Program().test2();
        }
        private void test1()
        {
            List<string> my = new List<string>();
            my.Add("OKOD");
            my.Add("GOD");
            my.Add("ODD");
            my.Add("EVEN");
            my.Add("POD");
            my.Add("TODO");
            my.Add("QUEEN");

            List<string> me = new List<string>();

            string key = "OD";

            my.ForEach(delegate(string s)
            {
                if (s.IndexOf(key) > -1) me.Add(s);
            });

            Console.WriteLine("----- result -----");
            me.ForEach(delegate(string s)
            {
                Console.WriteLine("{0}", s);
            });
            Console.In.ReadLine();
        }
        private void test2()
        {
            ArrayList list1 = new ArrayList();
            ArrayList list2 = new ArrayList();

            list1.Add("OKOD");
            list1.Add("GOD");
            list1.Add("ODD");
            list1.Add("EVEN");
            list1.Add("POD");
            list1.Add("TODO");
            list1.Add("QUEEN");

            string key = "OD";
            foreach (string s in list1)
            {
                if (s.IndexOf(key) > -1) list2.Add(s);
            }

            Console.WriteLine("------ result2 ------");
            foreach (string s in list2)
            {
                Console.WriteLine("{0}", s);
            }
            
            Console.In.ReadLine();

        }
    }

こうだす。きっと熟練さんからしたらダメだしものだろうけど
これが精一杯w。

引用返信 編集キー/
■26110 / inTopicNo.9)  Re[5]: ArrayListでの文字列検索
□投稿者/ ま (133回)-(2008/10/02(Thu) 02:16:37)
No26109 (ま さん) に返信
> new Program().test1();

こっちは、delegate と Generic 使ったもの、2003 の C# では動くのかな?微妙?

> new Program().test2();

こっちは、delegate も Generic もつかって無いけど foreach がダメかもしれん。
その時は、GetEnumlator とか使って while で回してくださいな。

C#再修業します・・・やる時間無いけど・・・



引用返信 編集キー/
■26119 / inTopicNo.10)  Re[5]: ArrayListでの文字列検索
□投稿者/ みきぬ (128回)-(2008/10/02(Thu) 09:54:33)
No26109 (ま さん) から引用:
>         private void test2()
>         {
>             ArrayList list1 = new ArrayList();
>             ArrayList list2 = new ArrayList();
> 
>             list1.Add("OKOD");
>             list1.Add("GOD");
>             list1.Add("ODD");
>             list1.Add("EVEN");
>             list1.Add("POD");
>             list1.Add("TODO");
>             list1.Add("QUEEN");
> 
>             string key = "OD";
>             foreach (string s in list1)
>             {
>                 if (s.IndexOf(key) > -1) list2.Add(s);
>             }
> 
>             Console.WriteLine("------ result2 ------");
>             foreach (string s in list2)
>             {
>                 Console.WriteLine("{0}", s);
>             }
>             
>             Console.In.ReadLine();
> 
>         }
>     }

これの ArrayList を単に StringCollection(これならVisualStudio2003にもある)に変えれば、
私が想定したものになります。

そうする理由:実行時にキャスト例外が発生する可能性があるのが嫌。ただそれだけ。

引用返信 編集キー/
■26125 / inTopicNo.11)  Re[6]: ArrayListでの文字列検索
□投稿者/ やきいも (5回)-(2008/10/02(Thu) 11:44:59)
No26110 (ま さん) に返信
> ■No26109 (ま さん) に返信
>>            new Program().test1();
> 
> こっちは、delegate と Generic 使ったもの、2003 の C# では動くのかな?微妙?
> 
>>            new Program().test2();
> 
> こっちは、delegate も Generic もつかって無いけど foreach がダメかもしれん。
> その時は、GetEnumlator とか使って while で回してくださいな。
> 
> C#再修業します・・・やる時間無いけど・・・
> 

ま さん、みきぬ さんありがとうございます。
void test2();を試したらできました。それとstringCollectionにしたものも試しましたがこちらも思うように動きました。

// StringCollection
static StringCollection sc1 = new StringCollection();
static StringCollection sc2 = new StringCollection();


sc1.Add("RRuu");
sc1.Add("iiRR");
sc1.Add("uuRR");
sc1.Add("abcde");


foreach(string s in sc1)
{
    if(s.IndexOf("RR") > -1)
    {
	sc2.Add(s);  // "RR"を含む文字列を格納
    }
}

test1()については試しましたが、Genericが対応していないようでうごきませんでした。

StringCollectionの存在について知れたのでとても参考になりました。
解決できました。ありがとうございます。








解決済み
引用返信 編集キー/
■26127 / inTopicNo.12)  Re[6]: ArrayListでの文字列検索
□投稿者/ たくボン (40回)-(2008/10/02(Thu) 12:41:18)
No26110 (ま さん) に返信
> ■No26109 (ま さん) に返信
> こっちは、delegate と Generic 使ったもの、2003 の C# では動くのかな?微妙?

解決してるので蛇足だけど、2003だと型指定されたCollectionを実装する場合はCollectionクラスを継承するのが簡単じゃないかな。


using System;
using System.Collections;

public class HogeCollection : CollectionBase
{
	public HogeCollection()
	{
	}

	public Hoge this[int index]  
	{
		get
		{
			return (Hoge)List[index];
		}
		set  
		{
			List[index] = value;
		}
	}

	public int Add(Hoge hoge)
	{		
		return List.Add(hoge);
	}

	public void AddRange(Hoge[] hoges)
	{
		foreach (Hoge hoge in hoges)	Add(hoge);
	}

	public int IndexOf(Hoge hoge)  
	{
		return List.IndexOf(hoge);
	}

	public void Insert(int index, Hoge hoge)  
	{
		List.Insert(index, hoge);
	}

	public void Remove(Hoge hoge)
	{
		List.Remove(hoge);
	}

	public bool Contains(Hoge hoge)  
	{
		return List.Contains(hoge);
	}

	protected override void OnInsertComplete(int index, object hoge)
	{
		base.OnInsertComplete(index, hoge);
	}

	protected override void OnRemoveComplete(int index, object hoge)
	{
		base.OnRemoveComplete(index, hoge);
	}
}

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -