有没有一种优雅的方法将这个字符串数组转换为:
string[] a = new[] {"name", "Fred", "colour", "green", "sport", "tennis"};
把数组转换成一个字典,使得数组中的每两个连续元素成为字典中的一对{key, value}(例如 {"name" -> "Fred", "colour" -> "green", "sport" -> "tennis"})。 我可以通过循环轻松完成它,但是否有更优雅的方式,也许使用LINQ?
有没有一种优雅的方法将这个字符串数组转换为:
string[] a = new[] {"name", "Fred", "colour", "green", "sport", "tennis"};
var dict = a.Select((s, i) => new { s, i })
.GroupBy(x => x.i / 2)
.ToDictionary(g => g.First().s, g => g.Last().s);
既然这是一个数组,我会这样做:
var result = Enumerable.Range(0,a.Length/2)
.ToDictionary(x => a[2 * x], x => a[2 * x + 1]);
var q = a.Zip(a.Skip(1), (Key, Value) => new { Key, Value })
.Where((pair,index) => index % 2 == 0)
.ToDictionary(pair => pair.Key, pair => pair.Value);
我已经制定了一个类似的方法来处理这种类型的请求。但是,由于您的数组包含键和值,我认为您需要先将其拆分。
然后,您可以使用类似以下的内容来将它们组合起来
public static IDictionary<T, T2> ZipMyTwoListToDictionary<T, T2>(IEnumerable<T> listContainingKeys, IEnumerable<T2> listContainingValue)
{
return listContainingValue.Zip(listContainingKeys, (value, key) => new { value, key }).ToDictionary(i => i.key, i => i.value);
}
a.Select((input, index) = >new {index})
.Where(x=>x.index%2!=0)
.ToDictionary(x => a[x.index], x => a[x.index+1])
我建议使用for循环,但我已按照您的要求进行了回答。这绝不是更整洁/更清洁的方法。
public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
{
bool shouldReturn = true;
foreach (T item in source)
{
if (shouldReturn)
yield return item;
shouldReturn = !shouldReturn;
}
}
public static Dictionary<T, T> MakeDictionary<T>(IEnumerable<T> source)
{
return source.EveryOther()
.Zip(source.Skip(1).EveryOther(), (a, b) => new { Key = a, Value = b })
.ToDictionary(pair => pair.Key, pair => pair.Value);
}
由于这个设置以及 Zip
的工作原理,如果列表中有奇数个项目,则最后一个项目将被忽略,而不是生成某种异常。
注意:源自this answer.
IEnumerable<string> strArray = new string[] { "name", "Fred", "colour", "green", "sport", "tennis" };
var even = strArray.ToList().Where((c, i) => (i % 2 == 0)).ToList();
var odd = strArray.ToList().Where((c, i) => (i % 2 != 0)).ToList();
Dictionary<string, string> dict = even.ToDictionary(x => x, x => odd[even.IndexOf(x)]);