2009-02-11 2 views
1

Souvent je me retrouve à remplir des répéteurs ASP.NET avec des éléments qui ont besoin de la classe CSS en fonction de l'index: 'first' pour l'index 0, 'last' pour l'index (length-1) et 'mid' au milieu:Y a-t-il une façon plus agréable/en ligne d'accomplir ce qui suit en C#/LINQ?

_repeater.DataSource = from f in foos 
         select new 
         { 
         ..., 
         CssClass = MakeCssClass(foos, f) 
         }; 


private static string MakeCssClass(Foo[] foos, Foo f) 
{ 
    var index = Array.IndexOf(foos, f); 

    if(index == 0) 
    { 
    return "first"; 
    } 
    else if(index == foos.Length - 1) 
    { 
    return "last"; 
    } 
    else 
    { 
    return "mid"; 
    } 
} 

Existe-t-il une meilleure façon de réaliser cela (par exemple en utilisant les fonctions lambda)? Si j'essaye je reçois CS0828, "ne peut pas assigner l'expression de lambda à la propriété de type anonyme".

Répondre

4

Vous pourriez être intéressé par mon type SmartEnumerable dans MiscUtil.

A partir de la page d'utilisation, il y a un exemple:

using System; 
using System.Collections.Generic; 

using MiscUtil.Collections; 

class Example 
{ 
    static void Main(string[] args) 
    { 
     List<string> list = new List<string>(); 
     list.Add("a"); 
     list.Add("b"); 
     list.Add("c"); 
     list.Add("d"); 
     list.Add("e"); 

     foreach (SmartEnumerable<string>.Entry entry in 
       new SmartEnumerable<string>(list)) 
     { 
      Console.WriteLine ("{0,-7} {1} ({2}) {3}", 
           entry.IsLast ? "Last ->" : "", 
           entry.Value, 
           entry.Index, 
           entry.IsFirst ? "<- First" : ""); 
     } 
    } 
} 

Avec des variables implicitement typés et un peu plus l'inférence de type la syntaxe pourrait être rangea assez facilement. Je dois y revenir un peu, mais les bases sont déjà là.

+0

Belle, merci. J'ai ajouté une méthode d'aide à SmartEnumerable.Entry: publique V FirstMidLast (V premier, V mi, V dernier) { if (IsFirst) { retour en premier; } sinon if (IsLast) { retour le dernier; } sinon { retour moyen; } } – stusmith

0

Voici une manière astucieuse d'obtenir ces médiums: Sauter, Reculer, Sauter (qu'est-ce que c'est, UNO?).

List<SomeClass> myList = foos 
    .Select(f => new SomeClass{ ..., CssClass=string.Empty }) 
    .ToList(); 

if (myList.Any()) 
{   
    myList.First().CssClass = "first"; 
    myList.Last().CssClass = "last"; 
    foreach(var z in myList.Skip(1).Reverse().Skip(1)) 
    { 
    z.CssClass = "mid"; 
    } 
} 

_repeater.DataSource = myList; 

Voici une meilleure façon de résoudre ce problème.

List<SomeClass> myList = foos 
    .Select(f => new SomeClass{ ..., CssClass="mid" }) 
    .ToList(); 

if (myList.Any()) 
{  
    myList.First().CssClass = "first"; 
    myList.Last().CssClass = "last"; 
} 

_repeater.DataSource = myList; 

Bien sûr, aucune de ces techniques ne fonctionnera si vous utilisez des types anonymes (leurs propriétés sont en lecture seule). N'utilisez pas de types anonymes pour les résultats de la requête.

+0

Je préfère les types anonymes, car il vous donne une certaine quantité de vérification à la compilation entre le schéma de base de données et les pages ASP.NET. – stusmith

Questions connexes