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

问题描述 投票:0回答:10

是否有一个内置函数可以将字符串数组转换为字符串字典,或者是否需要在此处进行循环?

c# arrays dictionary
10个回答
126
投票

假设您使用 .NET 3.5,您可以将任何序列(即

IEnumerable<T>
)转换为字典:

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

其中

Key
Value
是您想要充当键和值的适当属性。如果该项本身就是您想要的值,您可以只指定一个用于键的投影。

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

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

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

如果您实际上只想要一个set(例如,您可以检查它是否包含特定字符串),您可以使用:

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

21
投票

您可以使用 LINQ 来执行此操作,但应首先回答 Andrew 提出的问题(您的键和值是什么):

using System.Linq;

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

结果是这样的字典:

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

17
投票

IMO,当我们说

Array
时,我们谈论的是一个值列表,我们可以通过调用其索引来获取值(值=>数组[索引]),所以正确的字典是带有索引键的字典.

感谢@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);
}

5
投票

如果您需要一本没有值的字典,您可能需要一个

HashSet

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

3
投票

你什么意思?

字典是一个哈希,其中键映射到值。

你的关键是什么?你的价值观是什么?

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

2
投票

我假设问题与键和值交替的数组有关。 我在尝试将 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);
}

0
投票
            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
投票

问题不是很清楚,但是是的,您可以将字符串转换为

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 =>
        {
            if(s != null && s.Length != 0)
                keyValuePairs.Add(s.Split(keyValueDelimiter)[0], s.Split(keyValueDelimiter)[1]);
        });

    return keyValuePairs;
}

并且可以像这样使用它

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

因为扩展方法的默认参数是

;
=


0
投票

您可以通过

IEnumerable<T>
创建字典,包括数组:

var dictionary = myEnumerable.ToDictionary(element => element.Key,
                                           element => element.Value)

其中

Key
Value
是要存储在每个字典元素中的键和值。适用于 .NET Framework 3.5+/.NET Core 1.0+/.NET 5.0+。 官方文档。

如果您希望字典values成为原始可枚举中的元素:

   var dictionary = myEnumerable.ToDictionary(element => element.Key)

如果你只需要高性能的集合操作,你也许可以使用:

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

简单来说,HashSet类可以被认为是一个没有值的Dictionary集合。 官方文档。

(请注意,“序列”位于“完全不相关”的对象中。 最初提交了现有的答案编辑,但被作者拒绝,因此单独发布,包括指向微软官方文档的链接。)


0
投票

new string[] { "Sep", "Oct", "Nov", "Dec", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug" }

现在你想制作相同的字典,然后像这样定义它:

new Dictionary<string, object>() { { "Sep", null }, {"Oct", null }, {"Nov", null }, {"Dec", null }, {"Jan", null }, {"Feb", null }, {"Mar", null }, {"Apr", null }, {"May", null }, {"Jun", null }, {"Jul", null }, { "Aug", null } }

	
© www.soinside.com 2019 - 2024. All rights reserved.