有没有内置函数可以将字符串数组转换为字符串字典,还是需要在这里进行循环处理?
有没有内置函数可以将字符串数组转换为字符串字典,还是需要在这里进行循环处理?
假设您正在使用.NET 3.5,您可以将任何序列(即IEnumerable<T>
)转换为字典:
var dictionary = sequence.ToDictionary(item => item.Key,
item => item.Value)
其中Key
和Value
是你想要作为键和值的属性。如果项目本身就是你想要的值,你可以仅指定一个用于键的投影。
例如,如果您想将每个字符串的大写版本映射到原始版本,则可以使用以下方式:
var dictionary = strings.ToDictionary(x => x.ToUpper());
在你的情况下,你想要键和值是什么?
如果你只想要一个集合(例如,你可以检查它是否包含特定的字符串),你可以使用:
var words = new HashSet<string>(listOfStrings);
IndexOf
是个坏主意。如果目的是创建一个Dictionary<int, string>
,我会使用array.Select((value, index) => new { value, index }).ToDictionary(pair => pair.index, pair => pair.value);
。否则,如果数组中有多个相同的字符串,由于键不唯一,你将失败。 - Jon Skeetusing System.Linq;
string[] myArray = new[] { "A", "B", "C" };
myArray.ToDictionary(key => key, value => value);
结果是一个像这样的字典:
A -> A
B -> B
C -> C
在我看来,当我们说一个 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);
}
Select
重载来更有效且可靠地执行此操作。 - Jon SkeetSelect
。 - shA.t你的意思是什么?
字典是一种哈希表,其中键映射到值。
你的键是什么,你的值是什么?
foreach(var entry in myStringArray)
myDictionary.Add(????, entry);
我假设这个问题与键和值交替的数组有关。当我尝试将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);
}
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());
}
这个问题不是很清楚,但是如果提供的字符串带有一些字符来支持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 =>
{
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();
由于扩展方法的默认参数是;
和=
。
您可以通过以下方式从 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+。官方文档。
如果您希望字典值是原始可枚举对象中的元素:
var dictionary = myEnumerable.ToDictionary(element => element.Key)
如果您只需要高性能的集合操作,您可以尝试使用:
var words = new HashSet<string>(listOfStrings);