IEnumerable
s aynı boyutta iki, nasıl ben Linq kullanarak birDictionary
dönüştürebilirsiniz Verilen?Harita İki liste
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dictionary = /* Linq ? */;
Ve beklenen çıktısı:
A: Val A
B: Val B
C: Val C
Ben bunu başarmak için bazı basit bir yolu olup olmadığını merak ediyorum.
Performans konusunda endişelenmeli miyim? Büyük koleksiyonum varsa ne olur? bunu yapmak için daha kolay bir yol olup olmadığını bilmiyorum
, şu anda böyle yapıyorum:
I will döngü IEnumerable
bana elemanı ve dizini sağlayan bir uzantısı yöntemine sahip numara.
public static class Ext
{
public static void Each<T>(this IEnumerable els, Action<T, int> a)
{
int i = 0;
foreach (T e in els)
{
a(e, i++);
}
}
}
Ve indeksi, enumerable ve birlikte döngü bir başka Enumerable eş elemanını alır bir yöntem var.
public static Dictionary<TKey, TValue> Merge<TKey, TValue>(IEnumerable<TKey> keys, IEnumerable<TValue> values)
{
var dic = new Dictionary<TKey, TValue>();
keys.Each<TKey>((x, i) =>
{
dic.Add(x, values.ElementAt(i));
});
return dic;
}
O halde bunun gibi kullanın:
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dic = Util.Merge(keys, values);
Ve çıkış doğrudur:
.NET 4.0 (veya Rx den System.Interactive 3.5 sürümü) ileA: Val A
B: Val B
C: Val C
Başparmak yukarıya .Zip. Memnuniyetle BCL'ye yapılmış. Oldukça uzun zamandır kendi versiyonum vardı. – spender
@spender - Kendiniz yapmış olsanız bile, [Eric Lipperts Blog] 'dan (http://blogs.msdn.com/b/ericlippert/archive/2009/05/07/zip-me-up. aspx) – Oliver
Yazık bir "Zip" yöntemine ihtiyaç var. Yalnızca daha fazla istatistik yazılan diller genel değişkenlik parametrelerini destekliyorsa, 'Seç' bunu işleyecektir (Şemadaki 'harita' gibi). – leppie