2010-07-12 3 views
1

En essayant de faire une commande spécialepar Linq. Il doit ordonner par S puis P puis NB puis V puis NC. Je ne suis pas sûr si c'est la meilleure façon de dé cela, mais ce que j'ai:LINQ .OrderPar lettre unique puis par une autre lettre

repeater.DataSource = query.OrderBy(p => p.Title ?).ThenBy(?).ThenBy(?); 
+1

que voulez-vous dire par « commande par S puis P puis NB alors V et NC » ? – Steven

+0

Il doit commander par des lettres spécifiques, le reste est alphabétique –

+0

Postez-nous s'il vous plaît l'exemple de requête entrante, et ce que vous voulez à la sortie. –

Répondre

6

Si vous avez seulement ces valeurs distinctes dans le domaine, alors vous pouvez simplement utiliser un dictionnaire pour traduire les chaînes en nombres, comme ceci:

var order = new Dictionary<string, int>(); 
order.Add("S", 0); 
order.Add("P", 1); 
order.Add("NB", 2); 
order.Add("V", 3); 
order.Add("Nc", 4); 
repeater.DataSource = query.OrderBy(p => order[p.Title]); 

Si la source est LINQ to SQL, vous doivent réaliser dans une première liste, de sorte que vous utilisez LINQ aux objets pour faire le tri:

repeater.DataSource = query.ToList().OrderBy(p => order[p.Title]); 
+0

+1. Bonne idée avec le tri. –

+0

+1 pour la bonne solution. Mais que faire si quoi si la clé n'est pas présente dans le dictionnaire? J'ai 2 types de tailles, c'est-à-dire pour des T-shirts petits, moyens etc., mais j'ai aussi des chaussures, 6, 6.5 etc. je veux trier le petit à xl dans le dictionnaire mais les nombres de bas à haut. Dois-je inclure toutes les tailles de chaussures dans le dictionnaire? – edgarpetrauskas

+1

@edgarpetrauskas: Vous pouvez utiliser une expression qui vérifie le dictionnaire et a un code alternatif pour les autres cas, quelque chose comme: '.OrderBy (p => order.HasKey (p.Size)? Order [p.Size]: p.Size) ' – Guffa

4

Vous devez utiliser la signature OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>) et écrire votre propre comparateur pour ce cas.

+0

et je suis toujours vide - pourriez-vous écrire un exemple ou donner un peu plus de conseils? –

+0

Notez que cela ne fonctionnera pas avec les arborescences LINQ to Expression (LINQ to SQL, LINQ to Entities, NHibernate LINQ, etc.). Encore +1. – Steven

1
query.OrderBy(p => p.Title, new MySpecialComparer()); 

public class MySpecialComparer : IComparer<string> 
{ 
    private static Dictionary<string, int> parser = new Dictionary<string, int>(); 

    static MySpecialComparer() 
    { 
     parser.Add("S", 0); 
     parser.Add("P", 1); 
     parser.Add("NB", 2); 
     parser.Add("V", 3); 
     parser.Add("NC", 4); 
    } 


    public int Compare(string x, string y) 
    { 
     return parser[x] - parser[y]; 
    } 
} 
+0

Cela me donne une" surcharge non prise en charge utilisée pour l'opérateur de requête "OrderBy". " –

+0

@Buckley: Ca marche pour moi. Utilisez-vous Linq to SQL? Quel est le type de 'query'? –

+0

Sa Linq à Sql oui et requête est juste une requête normale comme: var query = à partir de p dans dc.Products sélectionnez p; –

Questions connexes