web-dev-qa-db-ja.com

文字列配列を文字列の辞書に変換する最もエレガントな方法

文字列配列を文字列の辞書に変換するための組み込み関数はありますか、それともここでループを行う必要がありますか?

40
leora

.NET 3.5を使用していると仮定すると、任意のシーケンス(つまり、IEnumerable<T>)辞書へ:

var dictionary = sequence.ToDictionary(item => item.Key,
                                       item => item.Value)

ここで、KeyおよびValueは、キーおよび値として機能させる適切なプロパティです。アイテム自体が必要な値である場合、キーに使用される投影を1つだけ指定できます。

したがって、たとえば、各文字列の大文字バージョンを元の文字列にマッピングする場合は、次を使用できます。

var dictionary = strings.ToDictionary(x => x.ToUpper());

あなたの場合、キーと値は何にしたいですか?

実際にset(たとえば、特定の文字列が含まれているかどうかを確認できます)が必要な場合は、次を使用できます。

var words = new HashSet<string>(listOfStrings);
79
Jon Skeet

LINQを使用してこれを行うことができますが、最初にAndrewが尋ねる質問に答える必要があります(キーと値は何ですか)。

using System.Linq;

string[] myArray = new[] { "A", "B", "C" };
myArray.ToDictionary(key => key, value => value);

結果は次のような辞書になります。

A -> A
B -> B
C -> C
14

IMO、Arrayと言うとき、そのインデックス(value => array [index])を呼び出すことで値を取得できる値のリストについて話しているので、正しい辞書はキーを持つ辞書ですインデックスの。

@John Skeetのおかげで、それを達成する適切な方法は次のとおりです。

var dictionary = array
    .Select((v, i) => new {Key = i, Value = v})
    .ToDictionary(o => o.Key, o => o.Value);

別の方法は、次のような拡張メソッドを使用することです。

public static Dictionary<int, T> ToDictionary<T>(this IEnumerable<T> array)
{
    return array
        .Select((v, i) => new {Key = i, Value = v})
        .ToDictionary(o => o.Key, o => o.Value);
}
6
shA.t

値のない辞書が必要な場合は、 HashSet が必要になる場合があります。

var hashset = new HashSet<string>(stringsArray);
5
Kobi

どういう意味ですか?

辞書はハッシュであり、キーは値にマップされます。

あなたの鍵は何であり、あなたの価値は何ですか?

foreach(var entry in myStringArray)
    myDictionary.Add(????, entry);
3
Andrew Bullock

質問はあまり明確ではありませんが、はい、文字列をDictionary<Key,Value>ペアをサポートするためにいくつかの文字で区切られている場合、文字列をDictionaryに変換できます

したがって、文字列がa=first;b=second;c=third;d=fourthのような場合、最初に;に基づいて分割し、次に=に基づいてDictionary<string,string>を作成して、以下の拡張メソッドでも同じことができます

public static Dictionary<string, string> ToDictionary(this string stringData, char propertyDelimiter = ';', char keyValueDelimiter = '=')
{
    Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
    Array.ForEach<string>(stringData.Split(propertyDelimiter), s =>
        {
            keyValuePairs.Add(s.Split(keyValueDelimiter)[0], s.Split(keyValueDelimiter)[1]);
        });

    return keyValuePairs;
}

のように使用できます

var myDictionary = "a=first;b=second;c=third;d=fourth".ToDictionary();

拡張メソッドのデフォルトのパラメーターは;=であるためです。

0
Vinod Srivastav
            Dictionary<int, string> dictionaryTest = new Dictionary<int, string>();

            for (int i = 0; i < testArray.Length; i++)
            {
                dictionaryTest.Add(i, testArray[i]);
            }

            foreach (KeyValuePair<int, string> item in dictionaryTest)
            {


                Console.WriteLine("Array Position {0} and Position Value {1}",item.Key,item.Value.ToString()); 
            }
0
Dwizzle