最优雅的方式将字符串数组转换为字符串字典

时间:2009-09-06 11:18:06

标签: c# arrays dictionary

是否有用于将字符串数组转换为字符串字典的内置函数,或者您是否需要在此处执行循环?

8 个答案:

答案 0 :(得分:75)

假设您使用的是.NET 3.5,您可以将任何序列(即IEnumerable<T>)转换为字典:

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

其中KeyValue是您希望充当键和值的相应属性。如果项目本身是您想要的值,则只能指定一个用于键的投影。

例如,如果您想将每个字符串的大写版本映射到原始字符串,可以使用:

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

在您的情况下,您希望键和值是什么?

如果你真的只想要一个 set (你可以查看它是否包含特定的字符串),你可以使用:

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

答案 1 :(得分:14)

您可以使用LINQ执行此操作,但安德鲁要求的问题应首先得到解答(您的密钥和值是什么):

using System.Linq;

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

结果是这样的字典:

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

答案 2 :(得分:5)

如果您需要没有值的字典,则可能需要HashSet

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

答案 3 :(得分:4)

IMO,当我们说Array我们正在谈论一个值列表,我们可以通过调用它的索引(value =&gt; 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);
}

答案 4 :(得分:3)

你是什么意思?

字典是一个散列,其中键映射到值。

你的钥匙是什么,你的价值观是什么?

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

答案 5 :(得分:0)

问题不是很清楚,但是可以,只要将字符串用某些字符分隔以支持Dictionary对,您就可以将字符串转换为Dictionary<Key,Value>

因此,如果一个字符串像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();

因为扩展方法的默认参数为;=

答案 6 :(得分:0)

我假设问题与键和值交替的数组有关。尝试将Redis协议转换为字典时遇到了这个问题。

private Dictionary<T, T> ListToDictionary<T>(IEnumerable<T> a)
{
    var keys = a.Where((s, i) => i % 2 == 0);
    var values = a.Where((s, i) => i % 2 == 1);
    return keys
        .Zip(values, (k, v) => new KeyValuePair<T, T>(k, v))
        .ToDictionary(kv => kv.Key, kv => kv.Value);
}

答案 7 :(得分:-1)

            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()); 
            }