none
List<string>.Remove、Containsの大文字小文字の区別について RRS feed

  • 質問

  • いつもお世話になります。

    mkmarimoです。

     

    基礎的なことで申し訳ありませんが、ご教授ください。

     

    件名にありますように、List<string>.RemoveやContainsメソッドのヘルプをみると、

     

    「リスト内の値の型である T の既定の等値比較演算子 EqualityComparer.Default を使用して、

     値が等しいかどうかを確認します。」

     

    との記載がありますが、string型ではEqualityComparer.Default は大文字小文字を

    区別するのでしょうか?

     

    実際は大文字小文字を区別させたくないのですが、それをList<T>で明に

    指定できるのでしょうか?

     

    Dictionaryだと、コンストラクタでできるみたいですが、List<T>の

    やり方がわからないため質問させていただきました。

    2009年1月26日 7:31

回答

  •  mkmarimo さんからの引用

    上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?

    もしよければもう少し具体的にご教授願えますか。

    2パラメータを指定できるContainsメソッドは.NET Framework 3.5の追加要素になります。

     

    拡張メソッドの仕組みを利用して、List<T>にメソッドがあたかも増えたかのように装っています。

    http://msdn.microsoft.com/ja-jp/library/bb339118.aspx

     

    Removeメソッドには同様の仕組みはありません。

     

    2009年1月26日 14:21
    モデレータ
  • もっと良いやり方があるかもしれませんが、力業で実現するならstringクラスのインスタンスを持つ入れ物を用意するとかでしょうかね。

     

    Code Snippet

    class Program
    {
        static void Main(string[] args)
        {
            List<string> testList = new List<string>();
            testList.Add("abc");
           
            List<StringWrapper> wrapperTestList = new List<StringWrapper>();
            wrapperTestList.Add("abc");

     

            Console.WriteLine("List<string>.Contains(\"ABC\") : " +

                testList.Contains("ABC"));
            Console.WriteLine("List<StringWrapper>.Contains(\"ABC\") : " +

                wrapperTestList.Contains("ABC"));
        }
    }

     

    public class StringWrapper : IEquatable<StringWrapper>
    {
        private string innerText;

     

        /// <summary>
        /// stringからStringWrapperを作るための手抜き用
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static implicit operator StringWrapper(string source)
        {
            return new StringWrapper(source);
        }

     

        /// <summary>
        /// デフォルトコンストラクタ
        /// </summary>
        public StringWrapper()
        {
        }

     

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="source"></param>
        public StringWrapper(string source)
        {
            this.innerText = source;
        }

     

        /// <summary>
        /// stringにアクセスするためのプロパティ
        /// </summary>
        public string Text
        {
            get { return this.innerText; }
            set { innerText = value; }
        }

     

        /// <summary>
        /// 比較メソッド
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public bool Equals(StringWrapper other)
        {
            if (other == null) return false;
            // 比較自体はStringComparerにお任せ
            return (StringComparer.CurrentCultureIgnoreCase.Compare(this.innerText, other.innerText) == 0);
        }
    }

     

     

     

    2009年1月26日 14:38
    モデレータ
  •  mkmarimo さんからの引用

    上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?

    .NET Framework 3.5より前でしたか・・・。

    それならば、BinarySearchとRemoveAtを使用するとかかな。

    でも、DictionaryやHashtable等を使用する方が簡単でしょうね。

    2009年1月26日 15:59

すべての返信

  • karashimaさん

     

    ご回答ありがとうございます。

    mkmarimoです。

     

     karashima さんからの引用

    区別すると思います。

     

    やはりそうですか。

     

     karashima さんからの引用

    第2パラメータにStringComparer クラスのインスタンスを渡すとか。

     

    上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?

    もしよければもう少し具体的にご教授願えますか。

     

     

     

    2009年1月26日 10:03
  •  mkmarimo さんからの引用

    上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?

    もしよければもう少し具体的にご教授願えますか。

    2パラメータを指定できるContainsメソッドは.NET Framework 3.5の追加要素になります。

     

    拡張メソッドの仕組みを利用して、List<T>にメソッドがあたかも増えたかのように装っています。

    http://msdn.microsoft.com/ja-jp/library/bb339118.aspx

     

    Removeメソッドには同様の仕組みはありません。

     

    2009年1月26日 14:21
    モデレータ
  • もっと良いやり方があるかもしれませんが、力業で実現するならstringクラスのインスタンスを持つ入れ物を用意するとかでしょうかね。

     

    Code Snippet

    class Program
    {
        static void Main(string[] args)
        {
            List<string> testList = new List<string>();
            testList.Add("abc");
           
            List<StringWrapper> wrapperTestList = new List<StringWrapper>();
            wrapperTestList.Add("abc");

     

            Console.WriteLine("List<string>.Contains(\"ABC\") : " +

                testList.Contains("ABC"));
            Console.WriteLine("List<StringWrapper>.Contains(\"ABC\") : " +

                wrapperTestList.Contains("ABC"));
        }
    }

     

    public class StringWrapper : IEquatable<StringWrapper>
    {
        private string innerText;

     

        /// <summary>
        /// stringからStringWrapperを作るための手抜き用
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static implicit operator StringWrapper(string source)
        {
            return new StringWrapper(source);
        }

     

        /// <summary>
        /// デフォルトコンストラクタ
        /// </summary>
        public StringWrapper()
        {
        }

     

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="source"></param>
        public StringWrapper(string source)
        {
            this.innerText = source;
        }

     

        /// <summary>
        /// stringにアクセスするためのプロパティ
        /// </summary>
        public string Text
        {
            get { return this.innerText; }
            set { innerText = value; }
        }

     

        /// <summary>
        /// 比較メソッド
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public bool Equals(StringWrapper other)
        {
            if (other == null) return false;
            // 比較自体はStringComparerにお任せ
            return (StringComparer.CurrentCultureIgnoreCase.Compare(this.innerText, other.innerText) == 0);
        }
    }

     

     

     

    2009年1月26日 14:38
    モデレータ
  •  mkmarimo さんからの引用

    上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?

    .NET Framework 3.5より前でしたか・・・。

    それならば、BinarySearchとRemoveAtを使用するとかかな。

    でも、DictionaryやHashtable等を使用する方が簡単でしょうね。

    2009年1月26日 15:59
  • ご回答くださったみなさま

     

    ありがとうございます。mkmarimoです。

     

    現状使っている.NETは2.0ですので、ご教授くださった方法では

    実現できないことはわかりました。

     

    現状List<T>内の要素数も少ないので、力技で対応したいと思います。

     

    あきらめがついた分、相談させていただいてよかったです。

     

    以上、ありがとうございました。

     

     

     

    2009年1月27日 11:19