7 sept. 2015

[snippet] Méthode d'extension C# ToTuple

J'ai eu besoin d'exporter sous la forme d'un tableau d'objet certaines colonnes résultantes d'une expression LINQ.
Mon objectif était de sérialiser le résultat en JSON avec JavascriptSerializer avec un tableau non-associatif (pas de paire clé-valeur).

public static object[] ToTuple<T, U, V>(this 
IEnumerable<T> queryable, Func<T, U> t1)
        {
            List<object[]> tab = new List<object[]>();
            foreach (var e in queryable)
                tab.Add(new object[] { t1.Invoke(e) });
            return tab.ToArray();
        }  
 
//...
 
public static object[] ToTuple<T, U, V, W, X, Y, Z>(this 
IEnumerable<T> queryable, Func<T, U> t1, Func<T, V> 
t2, Func<T, W> t3, Func<T, X> t4, Func<T, Y> t5, 
Func<T, Z> t6)
        {
            List<object[]> tab = new List<object[]>();
            foreach (var e in queryable)
                tab.Add(new object[] { t1.Invoke(e), t2.Invoke(e), t3.Invoke(e), t4.Invoke(e), t5.Invoke(e), t6.Invoke(e) });
            return tab.ToArray();
        } 

Ces méthodes sont à ajouter dans des classes statiques pour être utilisables.
Note : on pourrait retourner un Tuple<U,V...>[] à la place de object[], mais la sérialisation serait associative avec les clés Item1, Item2...