CompareOptionsのうち、IgnoreNonSpaceは濁点付きの文字、囲み文字や発音記号など、基本となる文字と修飾記号の組み合わせになる文字について、その組み合わせを無視して比較するように指定します。 これらの値や他の値と組み合わせて使用することも出来ます。 CompareOptions.IgnoreNonSpaceの解説では、

文字列比較で、発音区別符など、非スペーシング組み合わせ文字を無視するように指定します。 Unicode 標準は、新しい文字を生成するために基本文字と組み合わせられる文字を組み合わせ文字として定義しています。非スペーシング組み合わせ文字は、表示されるときに文字間隔用の領域は確保しません。

CompareOptions 列挙体

とされています。 非スペーシング組み合わせ文字とは、Unicodeのカテゴリ'Mark, Nonspacing' [Mn]のことで、これに該当する文字は比較の際に無視されることになります。

まずは、具体的な例と比較結果を見てみます。

CompareOptions.IgnoreNonSpaceを指定して濁点半濁点・囲み文字・修飾記号を無視して比較する
using System;
using System.Globalization;
using System.Threading;

class Sample {
  static void Main()
  {
    Console.WriteLine(Thread.CurrentThread.CurrentCulture);

    Compare("cafe", "café", CompareOptions.None);
    Compare("cafe", "café", CompareOptions.IgnoreNonSpace);

    Compare("cat", "cæt", CompareOptions.None);
    Compare("cat", "cæt", CompareOptions.IgnoreNonSpace);
    Compare("caet", "cæt", CompareOptions.None);
    Compare("caet", "cæt", CompareOptions.IgnoreNonSpace);
    Compare("caet", "cæt", CompareOptions.Ordinal);

    Console.WriteLine();

    Compare("えと", "えど", CompareOptions.None);
    Compare("えと", "えど", CompareOptions.IgnoreNonSpace);
    Compare("ハン", "パン", CompareOptions.None);
    Compare("ハン", "パン", CompareOptions.IgnoreNonSpace);
    Compare("ウ", "ヴ", CompareOptions.None);
    Compare("ウ", "ヴ", CompareOptions.IgnoreNonSpace);

    Console.WriteLine();

    Compare("バ゙ン", "パン", CompareOptions.None);
    Compare("◎゛", "●", CompareOptions.None);

    Console.WriteLine();

    Compare("C", "©", CompareOptions.None);
    Compare("C", "©", CompareOptions.IgnoreNonSpace);
    Compare("C", "Ⓒ", CompareOptions.None);
    Compare("C", "Ⓒ", CompareOptions.IgnoreNonSpace);

    Console.WriteLine();

    Compare("1", "①", CompareOptions.None);
    Compare("1", "①", CompareOptions.IgnoreNonSpace);
    Compare("1", "①", CompareOptions.IgnoreNonSpace);
    Compare("1", "①", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth);
  }

  private static void Compare(string s1, string s2, CompareOptions options)
  {
    Console.WriteLine("{0} {1} : {2,2} ({3:f})", s1, s2, String.Compare(s1, s2, Thread.CurrentThread.CurrentCulture, options), options);
  }
}
実行結果
ja-JP
cafe café : -1 (None)
cafe café :  0 (IgnoreNonSpace)
cat cæt :  1 (None)
cat cæt :  1 (IgnoreNonSpace)
caet cæt :  0 (None)
caet cæt : -133 (Ordinal)

えと えど : -1 (None)
えと えど :  0 (IgnoreNonSpace)
ハン パン : -1 (None)
ハン パン :  0 (IgnoreNonSpace)
ウ ヴ : -1 (None)
ウ ヴ :  0 (IgnoreNonSpace)

バ゙ン パン :  0 (None)
◎゛ ● :  0 (None)

C © :  1 (None)
C © :  1 (IgnoreNonSpace)
C Ⓒ : -1 (None)
C Ⓒ :  0 (IgnoreNonSpace)

1 ① : -1 (None)
1 ① :  0 (IgnoreNonSpace)
1 ① :  1 (IgnoreNonSpace)
1 ① :  0 (IgnoreNonSpace, IgnoreWidth)

個々の実行結果について、詳しく説明します。

"cafe"と"café"
é(U+00E9 LATIN SMALL LETTER E WITH ACUTE)はe(U+0065 LATIN SMALL LETTER E)と́(U+0301 COMBINING ACUTE ACCENT)の組み合わせと等価とされています。
IgnoreNonSpaceの場合、カテゴリが'Mark, Nonspacing'である́(U+0301 COMBINING ACUTE ACCENT)が無視され、e(U+0065 LATIN SMALL LETTER E)として比較されるため、"cafe"と"café"は同じであると判断されます。
"cat"と"cæt"
æ(U+00E6 LATIN SMALL LETTER AE)は組み合わせた文字としては扱われないため、IgnoreNonSpaceの場合でも"cat"と"cæt"は異なると判断されます。
"caet"と"cæt"
インバリアントカルチャおよびja-JPでは"ae"と"æ"は同等であると判断されるため、NoneでもIgnoreNonSpaceでも"caet"と"cæt"は同じであると判断されます。
Ordinalの場合、a(U+0061 LATIN SMALL LETTER A)とæ(U+00E6 LATIN SMALL LETTER AE)はコードポイントが異なるため、"caet"と"cæt"は異なると判断されます。
"えと"と"えど"
(U+3069 HIRAGANA LETTER DO)は(U+3068 HIRAGANA LETTER TO)と(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)の組み合わせと等価とされています。
IgnoreNonSpaceの場合、カテゴリが'Mark, Nonspacing'である(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)が無視され、(U+3068 HIRAGANA LETTER TO)として比較されるため、"えと"と"えど"は同じであると判断されます。
"ハン"と"パン"
"ウ"と"ヴ"
(U+30D1 KATAKANA LETTER PA)は(U+30CF KATAKANA LETTER HA)と(U+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK)の組み合わせ、(U+30F4 KATAKANA LETTER VU)は(U+30A6 KATAKANA LETTER U)と(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)の組み合わせと等価とされています。
従って"えと"と"えど"の場合と同様、IgnoreNonSpaceの場合は濁点・半濁点が無視され、"ハン"と"パン"、"ウ"と"ヴ"はそれぞれ同じであると判断されます。
"バ゙ン"と"パン"
"◎゛ "と"●"
(U+30CF KATAKANA LETTER HA)に濁点が二つつけられたものと(U+30D1 KATAKANA LETTER PA)は等しくなります。 これは、濁点が基本となる文字に対して重み1を与え、半濁点が重み2を与えるためで、濁点二つと半濁点一つではどちらも同じ重みが与えられます。 その結果、"バ゙ン"と"パン"は同じであると判断されます。
(U+25CE BULLSEYE)に濁点がつけられたものと(U+25CF BLACK CIRCLE)が等しくなるのもこれと同じで、濁点によって重みが与えらることにより、"◎゛ "と"●"は同じであると判断されます。
参考: 「MS ACCESS 95/97 の美しいソート順」の謎に答える - ものがたり
"C"と"©"
"C"と"Ⓒ"
©(U+00A9 COPYRIGHT SIGN)は組み合わせた文字としては扱われないため、IgnoreNonSpaceの場合でも"C"と"©"は異なると判断されます。
一方(U+24B8 CIRCLED LATIN CAPITAL LETTER C)はC(U+0043 LATIN CAPITAL LETTER C)とほぼ等価とされているため、IgnoreNonSpaceの場合"C"と"Ⓒ"は同じであると判断されます。
"1"と"①"
"1"と"①"
(U+2460 CIRCLED DIGIT ONE)は1(U+0031 DIGIT ONE)とほぼ等価とされているため、IgnoreNonSpaceの場合"1"と"①"は同じであると判断されます。
また、(U+FF11 FULLWIDTH DIGIT ONE)は1(U+0031 DIGIT ONE)と全角半角の関係にあるため、IgnoreNonSpace+IgnoreWidthの場合"1"と"①"は同じであると判断されます。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。