2013-01-18 8 views
0
KeyValuePair<int, string>[][] partitioned = SplitVals(tsRequests.ToArray()); 

Ne vous inquiétez pas trop de la méthode que j'utilise; disons juste que je reçois un tableau irrégulier de KeyValuePairs qui sont répartis également dans différents tableaux.Convertir KeyValuePair <int,string> en un tableau int [] et un tableau de chaînes []

foreach (KeyValuePair<int, string>[] pair in partitioned) 
{ 
    foreach (KeyValuePair<int, string> k in pair) 
    { 
    } 
} 

J'ai besoin de savoir comment je peux obtenir efficacement les ints dans un tableau int, et les chaînes dans un tableau de chaînes séparée du tableau de keyvaluepairs. De cette façon, les deux index correspondent les uns aux autres dans des tableaux séparés.

Par exemple, après que je le diviser en un int [] tableau et une chaîne [] tableau,

intarray[3] must match stringarray[3] just like it did in the keyvaluepair. 

Disons que j'ai un tableau en dents de scie avec KVP comme:

[1][]<1,"dog">, <2,"cat"> 
    [2][]<3,"mouse">,<4,"horse">,<5,"goat"> 
    [3][]<6,"cow"> 

I besoin de ceci pour se transformer en chaque itération

1. 1,2/"dog","cat" 
    2. 3,4,5/"mouse", "horse", "goat" 
    3. 6/"cow" 

Répondre

5
int[] keys = partitioned.Select(pairs => pairs.Select(pair => pair.Key).ToArray()) 
    .ToArray(); 
string[] values = partitioned.Select(pairs => pairs.Select(pair => pair.Value).ToArray()) 
    .ToArray(); 
+0

ainsi je n'aurais même pas besoin de mettre est à l'intérieur de la boucle? – Ramie

+1

Les deux méthodes 'SelectMany' et' Select' passeront en boucle dans les séquences qui leur sont fournies en interne, de sorte que la boucle est en cours, vous n'avez pas besoin de les écrire vous-même. – Servy

+0

vous avez fait ce que je voulais avec le KVP, mais pas ce que je voulais dans son ensemble. La première boucle doit se produire indépendamment, c'est juste la deuxième boucle que je veux éviter. Je divise essentiellement mes tableaux keyvalpair en plusieurs tableaux, mais je ne veux pas tous les mettre dans deux grandes listes. Je veux mettre chaque partie dans la liste chaque fois qu'elle boucle. – Ramie

0
List<int> keys = new List<int>(); 
List<string> values = new List<string>(); 
foreach (KeyValuePair<int, string>[] pair in partitioned) 
{ 
    foreach (KeyValuePair<int, string> k in pair) 
    { 
     keys.Add(k.Key); 
     values.Add(k.Value); 
    } 
} 
keyArray = keys.ToArray(); 
valueArray = values.ToArray(); 
0

Juste pour vous aider à démarrer:

var list = new List<KeyValuePair<int, int>>(); 
    var key = new int[list.Count]; 
    var values = new int[list.Count]; 
    for (int i=0; i < list.Count ;i++) 
    { 
     key[i] = list[i].Key; 
     values[i] = list[i].Value; 
    } 
0
public static void ToArrays<K,V>(this IEnumerable<KeyValuePair<K,V>> pairs, 
    out K[] keys, out V[] values) 
{ 
    var keyList = new List<K>(); 
    var valueList = new List<V>(); 
    foreach (KeyValuePair<K,V> pair in pairs) 
    { 
     keyList.Add(pair.Key); 
     valueList.Add(pair.Value); 
    } 
    keys = keyList.ToArray(); 
    values = valueList.ToArray(); 
} 

Parce que vous avez un tableau en dents de scie, vous devez également aplatir utiliser cette fonction:

public static IEnumerable<T> flatten(this T[][] items) 
{ 
    foreach(T[] nested in items) 
    { 
     foreach(T item in nested) 
     { 
     yield return item; 
     } 
    } 
}  

Complémentez comme ceci:

MyKeyValuePairCollection = GetKeyValuePairJaggedArray(); 
int[] keys; 
string[] values; 
MyKeyValuePairCollection.flatten().ToArrays(out keys, out values); 
+0

Notez qu'il a un tableau en dents de scie de paires de valeurs clés. Ce n'est pas un 'IEnumerable >'. C'est un 'IEnumerable KeyValuePair >>'. – Servy

+0

J'utiliserais toujours la fonction ci-dessus, mais j'ai du code supplémentaire pour aplatir les jaggies en premier;) –

+1

Mon point est que c'est ce qui vous manque. Vous devriez ajouter cette fonction pertinente pour aplatir la liste. – Servy

Questions connexes