2009-04-29 13 views
1

J'essaie de créer une collection de chaînes dans un ordre défini par un autre tableau. Ça a l'air confus Je sais alors laissez-moi vous expliquerLINQ OrderBy help

requiredOrderOfElements

{ 
[0] category1, 
[1] categoryX, 
[2] something else 
} 

mon client passe un tableau de chaînes contenant la clé et la valeur-à-dire

passé du client

{ 
[0][0] categoryX, 
[0][1] value from Category X, 
[1][0] something else, 
[1][1] value for something else, 
[2][0] category1, 
[2][1] value from Category 1 
} 

ce que je veux, c'est la "valeur" des textes dans le besoin d 'ordre des clés

ce que je veux

[0]value from Category 1 
[1]value from Category X 
[2]value for something else 

Je l'ai regardé OrderBy/IComparer et ne peut pas voir une façon évidente de mettre en œuvre ce que je dois. Ma solution actuelle est une boucle forcée imbécile

Des idées pour une manière plus élégante seraient appréciées.

Mise à jour: - est ici le test

[TestFixture] 
public class GL_Linq_Test 
{ 
    [Test] 
    public void CanOrderByAnotherArray() 
    { 
     var requiredOrder=new[]{"my","required","order"}; 
     var passedFromClient = new[] 
            { 
             new[] {"required", "cat"}, 
             new[] {"order", "dog"}, 
             new[] {"my", "bird"} 
            }; 

     var ordered = FunkyOrderer.Order(requiredOrder, passedFromClient); 

     Assert.That(ordered.First()[1],Is.EqualTo("bird")); 
     Assert.That(ordered.Skip(1).First()[1], Is.EqualTo("cat")); 
     Assert.That(ordered.Skip(2).First()[1], Is.EqualTo("dog")); 
    } 
} 

public static class FunkyOrderer 
{ 
//returns order bird,dog,cat not bird,cat,dog   
public static IEnumerable<string[]> Order(string[] requiredOrder, IEnumerable<string[]>passedFromClient) 
    { 
     return from o in requiredOrder 
        join f in passedFromClient on o equals f[0] 
        orderby o 
        select f; 
    } 
} 
+1

@Gilly - Ce n'est pas assez d'informations pour commencer à avoir un sens. S'il vous plaît poster un exemple de code ou une mise en page de la façon dont chaque tableau ressemble réellement. –

+0

Hmmmm, je ne sais pas quoi d'autre à mettre! Je vais poster un test ci-dessous et voir si cela explique mieux – Gilly

Répondre

2

Le problème est que vous en supposant un tableau de chaînes sera commandé par leur index (ils ne seront pas). L'ordre de "my", "order", "required" est correct à l'aide du chèque intégré. La solution la plus simple consiste à modifier votre requête LINQ pour prendre en compte l'index lors de la commande.

return from o in requiredOrder.Select((o, i) => new { Value = o, Index = i }) 
     join f in passedFromClient on o.Value equals f[0] 
     orderby o.Index 
     select f; 
+0

génial - merci beaucoup. – Gilly

0
var orderByThese = new string[] { "category1", "categoryX", "something else" }; 

    var fromClient = new string[][] 
    { 
     new string[] { "categoryX", "value from Category X" }, 
     new string[] { "something else", "value for something else" }, 
     new string[] { "category1", "value from Category 1" } 
    }; 

    var joined = from o in orderByThese 
       join f in fromClient on o equals f[0] 
       orderby o 
       select f; 
+0

pas tout à fait - obtient le premier élément dans le tableau correctement, mais les deux autres sont à l'envers. Je vais poster un test – Gilly