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

C# 将字符串数组转换为字符串字典的最优雅的方法,c#,arrays,dictionary,C#,Arrays,Dictionary,是否有用于将字符串数组转换为字符串字典的内置函数,或者您需要在此处执行循环?您的意思是什么 字典是散列,其中键映射到值 你的关键是什么?你的价值观是什么 foreach(var entry in myStringArray) myDictionary.Add(????, entry); 假设您使用的是.NET 3.5,您可以将任何序列(即IEnumerable)转换为字典: var dictionary = sequence.ToDictionary(item => item.K

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

您的意思是什么

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

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

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

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

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);
var words=newhashset(listofstring);

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

结果是这样一个字典:

A -> A
B -> B
C -> C
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);
}

如果需要没有值的词典,则可能需要:

var hashset=新hashset(stringsArray);

IMO,当我们说一个
数组时,我们说的是一个值列表,我们可以通过调用它的索引(value=>Array[index])得到一个值,因此一个正确的字典就是一个索引键为的字典

感谢@John Skeet,实现这一目标的正确方法是:

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

另一种方法是使用如下扩展方法:

A -> A
B -> B
C -> C
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);
}
公共静态字典ToDictionary(此IEnumerable数组)
{
返回数组
.选择((v,i)=>new{Key=i,Value=v})
.ToDictionary(o=>o.Key,o=>o.Value);
}
字典字典test=new Dictionary();
对于(int i=0;i
问题不是很清楚,但您可以将字符串转换为
字典
,前提是该字符串用一些字符分隔,以支持
字典

因此,如果字符串类似于
a=first;b=秒;c=第三;d=第四个
您可以根据
首先拆分它
然后在
=
上创建一个
字典
下面的扩展方法也会这样做

publicstaticdictionary-ToDictionary(此字符串stringData,char-propertyDelimiter=';',char-keyValueDelimiter='='='))
{
Dictionary keyValuePairs=新字典();
Array.ForEach(stringData.Split(propertyDelimiter),s=>
{
如果(s!=null&&s.Length!=0)
添加(s.Split(keyValueDelimiter)[0],s.Split(keyValueDelimiter)[1]);
});
返回键值对;
}
并且可以像这样使用它

var myDictionary=“a=first;b=second;c=third;d=fourth”;

因为默认参数是
&
=
用于扩展方法。

我假设问题与键和值交替的数组有关。我在尝试将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);
}
private Dictionary ListToDictionary(IEnumerable a)
{
var key=a,其中((s,i)=>i%2==0);
var值=a,其中((s,i)=>i%2==1);
返回键
.Zip(值,(k,v)=>新的KeyValuePair(k,v))
.ToDictionary(千伏=>千伏键,千伏=>千伏值);
}

取决于您想要的结构。不管你怎么看,最终都会有一个循环。在某个地方总会有一个循环,但LINQ允许你隐藏它——也就是说,你不需要在代码中有循环。risc总是存在的,除非你之前检查是否有重复的键。@Dykam:的确如此。如果您想处理重复项,则可能需要
ToLookup
。如果OP解释了他们真正想做的事情,我们希望能了解更多。请参阅下面shA.t的帖子。字典中的键确实需要IndexOf,我同意shA.t的说法,人们正在寻找的是一本字典,其中的键是旧的数组索引。@mike:不,
IndexOf
是个坏主意。如果目标是创建一个
字典
我会使用
数组。选择((value,index)=>new{value,index})。ToDictionary(pair=>pair.index,pair=>pair.value)否则,如果数组中有多个相同的字符串,您将由于非唯一键而失败。John Skeet:我的困惑在于输入,而不是输出。OP要求转换“字符串数组”,而您给出了一个转换“任意序列(即IEnumerable)”的示例,我不清楚您建议如何将字符串[]转换为IEnumerable,就像您的示例序列一样。如果序列(输入)为,ToDictionary(item=>item.Key,item=>item.Value)肯定不起作用是字符串数组。这将a)效率低下;b) 如果相同的值在数组中出现多次,则失败。您可以使用提供索引的
Select
重载来更高效、更可靠地执行此操作。谢谢,我按照您引用的
Select
;)编辑代码。不要只是脱口而出代码!添加一些文字来描述此解决方案如何最好地回答该问题,这将提高答案的长期价值,并有助于防止在审阅期间将其删除。这正是我所需要的,谢谢!无法思考。
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);
}