トップ回答者
List<string>.Remove、Containsの大文字小文字の区別について

質問
-
いつもお世話になります。
mkmarimoです。
基礎的なことで申し訳ありませんが、ご教授ください。
件名にありますように、List<string>.RemoveやContainsメソッドのヘルプをみると、
「リスト内の値の型である T の既定の等値比較演算子 EqualityComparer.Default を使用して、
値が等しいかどうかを確認します。」
との記載がありますが、string型ではEqualityComparer.Default は大文字小文字を
区別するのでしょうか?
実際は大文字小文字を区別させたくないのですが、それをList<T>で明に
指定できるのでしょうか?
Dictionaryだと、コンストラクタでできるみたいですが、List<T>の
やり方がわからないため質問させていただきました。
回答
-
mkmarimo さんからの引用 上記ですが、RemoveもContainsもパラメータは1つしか取れないようですが?
もしよければもう少し具体的にご教授願えますか。
2パラメータを指定できるContainsメソッドは.NET Framework 3.5の追加要素になります。
拡張メソッドの仕組みを利用して、List<T>にメソッドがあたかも増えたかのように装っています。
http://msdn.microsoft.com/ja-jp/library/bb339118.aspx
Removeメソッドには同様の仕組みはありません。
-
もっと良いやり方があるかもしれませんが、力業で実現するならstringクラスのインスタンスを持つ入れ物を用意するとかでしょうかね。
Code Snippetclass 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);
}
}
すべての返信
-
mkmarimo さんからの引用 との記載がありますが、string型ではEqualityComparer.Default は大文字小文字を
区別するのでしょうか?
区別すると思います。
mkmarimo さんからの引用 実際は大文字小文字を区別させたくないのですが、それをList<T>で明に
指定できるのでしょうか?
第2パラメータにStringComparer クラスのインスタンスを渡すとか。
MSDN
# 追記
# あっ、これだとRemoveする時はだめかも
mkmarimo さんからの引用 | |
|
2パラメータを指定できるContainsメソッドは.NET Framework 3.5の追加要素になります。
拡張メソッドの仕組みを利用して、List<T>にメソッドがあたかも増えたかのように装っています。
http://msdn.microsoft.com/ja-jp/library/bb339118.aspx
Removeメソッドには同様の仕組みはありません。
もっと良いやり方があるかもしれませんが、力業で実現するならstringクラスのインスタンスを持つ入れ物を用意するとかでしょうかね。
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);
}
}