[C#] Linq OrderBy contre des valeurs spécifiques



Answers

En plus de @Daniel Brückner réponse et le problème défini à la fin de celui-ci:

Je n'aime pas Concat () et ToList () là-bas. Mais pour l'instant, je n'ai pas vraiment de bonne solution. Je cherche un bon truc pour transformer le -1 du premier exemple en un grand nombre.

Je pense que la solution est d'utiliser une déclaration lambda au lieu d'une expression lambda.

var data = new List<string> { "corge", "baz", "foo", "bar", "qux", "quux" };
var fixedOrder = new List<string> { "foo", "bar", "baz" };
data.OrderBy(d => {
                    var index = fixedOrder.IndexOf(d);
                    return index == -1 ? int.MaxValue : index; 
                  });

Les données commandées sont:

foo 
bar 
baz 
corge 
qux 
quux 
Question

Y at-il un moyen dans Linq de faire un OrderBy contre un ensemble de valeurs (les chaînes dans ce cas) sans connaître l'ordre des valeurs?

Considérez ces données:

A
B
A
C
B
C
D
E

Et ces variables:

chaîne firstPref, secondPref, thirdPref;

Lorsque les valeurs sont définies comme suit:

firstPref = 'A';
secondPref = 'B';
thirdPref = 'C';

Est-il possible de commander les données comme suit:

A
A
B
B
C
C
D
E



La solution de Danbrucs est plus élégante, mais voici une solution utilisant un IComparer personnalisé. Cela peut être utile si vous avez besoin de conditions plus avancées pour votre ordre de tri.

    string[] svals = new string[] {"A", "B", "A", "C", "B", "C", "D", "E"};
    List<string> list = svals.OrderBy(a => a, new CustomComparer()).ToList();

    private class CustomComparer : IComparer<string>
    {
        private string firstPref = "A";
        private string secondPref = "B";
        private string thirdPref = "C";
        public int Compare(string x, string y)
        {
            // first pref 
            if (y == firstPref && x == firstPref)
                return 0;
            else if (x == firstPref && y != firstPref)
                return -1;
            else if (y == firstPref && x != firstPref)
                return 1;
            // second pref
            else if (y == secondPref && x == secondPref)
                return 0;
            else if (x == secondPref && y != secondPref)
                return -1;
            else if (y == secondPref && x != secondPref)
                return 1;
            // third pref
            else if (y == thirdPref && x == thirdPref)
                return 0;
            else if (x == thirdPref && y != thirdPref)
                return -1;
            else
                return string.Compare(x, y);
        }
    }



Oui, vous devez implémenter votre propre IComparer<string> et le passer en second argument de la méthode OrderBy de LINQ.

Un exemple peut être trouvé ici: Commande des résultats LINQ






Links