3

私は次の列挙型を持っています:

public enum ReferenceKey {
    MenuType             = 1,
    ReferenceStatus      = 2,
    ContentType          = 3
}

このデータを2つのフィールドを持つIEnumerableとして一覧表示する方法はありますか。次のように、数値の最初のフィールドと、最初の単語と2番目の単語の間にスペースがある文字列の2番目のフィールド。

1  "Menu Type"
2  "Reference Status"
3  "Content Type"
4

4 に答える 4

4

このデータを 2 つのフィールドを持つ IEnumerable としてリストする方法はありますか。最初のフィールドは数値、2 番目のフィールドは文字列で、最初と 2 番目の単語の間にスペースがあります

なぜだめですか

解決策 2: 必要な配列

IEnumerable<ReferenceKey> v = 
                       Enum.GetValues(typeof(ReferenceKey)).Cast<ReferenceKey>();

string[] result = 
                  v.Select(x => (int)x + " \"" + x.ToString() + " \"").ToArray();

動いているのを見る

ここに画像の説明を入力


解決策 2: ADictionary<int, string>

string[] str = Enum.GetNames(typeof(ReferenceKey));

Dictionary<int, string> lst = new Dictionary<int, string>(); 

for (int i = 0; i < str.Length; i++)
    lst.Add((int)(ReferenceKey)Enum.Parse(typeof(ReferenceKey), str[i]), str[i]);

動いているのを見る

ここに画像の説明を入力


解決策 3: 別の作成方法Dictionary<int, string>

Array v = Enum.GetValues(typeof(ReferenceKey));

Dictionary<int, string> lst = v.Cast<ReferenceKey>()
                               .ToDictionary(x => (int)x, 
                                             x => x.ToString());

System.Linqこの名前空間を含める

動いているのを見る

ここに画像の説明を入力

于 2012-09-15T10:01:34.210 に答える
4

静的およびメソッドとDictionary一緒に使用します。GetNamesGetValues

 var names = ReferenceKey.GetNames(typeof(ReferenceKey));
 var values = ReferenceKey.GetValues(typeof(ReferenceKey)).Cast<int>().ToArray();

 var dict = new Dictionary<int, string>();
 for (int i = 0; i < names.Length; i++)
 {
     string name = names[i];
     int numChars = name.Length;
     for (int c = 1; c < numChars; c++)
     {
         if (char.IsUpper(name[c]))
         {
             name = name.Insert(c, " ");
             numChars++;
             c++;
         }
     }
     dict[values[i]] = name;
 }

GetValues
GetNames

指定したフォーマットを取得するには、次のようにします。

string[] formatted = dict.Select(s => String.Format("{0} \"{1}\"", s.Key, s.Value)).ToArray();
于 2012-09-15T10:02:23.370 に答える
3

単純な列挙可能としてそれが必要な場合は、次のようにします。

var names = Enum.GetNames(typeof(ReferenceKey));
var values = Enum.GetValues(typeof(ReferenceKey)).Cast<int>();
var pairs = names.Zip(values, (Name, Value) => new { Name, Value });

次の結果が得られます。

列挙可能なペア

辞書として使用したい場合は、次のようにします。

var dict = pairs.ToDictionary(x => x.Name, x => x.Value);

次の結果が得られます。

辞書ペア

各単語の間にスペースを追加したい場合は.Select(n => Regex.Replace(n, "([A-Z])", " $1").Trim());names変数定義に追加できます。

この間隔コードを使用すると、次の結果が得られます。

間隔の結果

于 2012-09-15T10:15:53.877 に答える
2

すべての列挙型に対するより一般的なアプローチ:

    static IEnumerable<string> EnumToEnumerable(Type x)
    {
        if (x.IsEnum)
        {
            var names = Enum.GetValues(x);

            for (int i = 0; i < names.Length; i++)
            {
                yield return string.Format("{0} {1}", (int)names.GetValue(i), names.GetValue(i));
            }
        }
    }

で呼び出す

EnumToEnumerable(typeof(ReferenceKey));
于 2012-09-15T10:05:17.857 に答える