0
votes

C # Commander par l'élément de liste avec groupe

J'ai une liste contient des objets bw code> avec 2 strong> propriétés em> sont forme code> et Quantité .

dépend de la valeur code> de la valeur code> et la valeur de la préquantité code> a été donnée, je vais trier em> par chaque élément de la liste code> avec le préshape code> et Prequantitaire code>. La forme code> code> est la priorité premier em> la quantité code> est seconde em> priorité. J'ai trié la liste code> avec groupeby code> puis trier par la forme code> code> et Quantité code> dépend du Preshape code> et Prequantitaire code>. Le résultat est bien comme ceci: p>

  • la valeur "Pré-forme": MN22 LI>
  • la valeur "pré-quantité": 20 li> ul>

    p> xxx pré>

    mais je voudrais avoir list code> comme ceci: p> xxx Pre>

    J'ai essayé d'utiliser pour code> boucle et swap code> fonction pour trier mais le résultat n'est pas comme ce que je recherche. P>

    Je voudrais trier par la liste avec le résultat comme la 2e table. P>

    J'ai besoin de grouper forme forte> pour les faire dans un groupe et je comparera de forme forte> de chaque élément de la liste avec la pré-forme pré-forme forte> si elles sont correspondantes, je trierai la liste avec pré-forme forte> alors le Quantité forte> sera la deuxième condition. Mais la quantité forte> du dernier élément du groupe A doit être suivie de la même quantité forte> du premier élément du groupe B. S'ils ne correspondent pas à la quantité strong> du premier élément du groupe B sera trié ASC. P>

    Je joins mon code ici pour plus de description Mon code DottNetFiddle P>

    public static void Main()
    {
        List<BW> lst = new List<BW>(){
            new BW(){ shape = "MN11", quantity = 20},
            new BW(){ shape = "MN11", quantity = 10},
            new BW(){ shape = "MN22", quantity = 14},
            new BW(){ shape = "MN22", quantity = 20},
            new BW(){ shape = "ANT", quantity = 16},
            new BW(){ shape = "ANT", quantity = 18},
            new BW(){ shape = "ANT", quantity = 20},
            new BW(){ shape = "ANT", quantity = 10}
    
        };
        string preShape = "MN22";
        int preQuantity = 20;
    
        var tempList = lst.GroupBy(c=>c.shape).Select(g=> new {shapeGroup = g.Key, BW = g.OrderBy(c=> c.shape.Equals(preShape)).ThenByDescending(c=>c.quantity)}).OrderByDescending(g=>g.shapeGroup.Equals(preShape));
        //var tempList = lst.GroupBy(c=>c.shape).Select(g=> new {shapeGroup = g.Key, BW = g.OrderByDescending(c => c.shape.Equals(preShape))}).OrderBy(g=>g.BW.First().quantity == preQuantity);;
    
        foreach (var shape in tempList)
        {
            var lastGroupBW_Item = shape.BW.LastOrDefault();
            //Console.WriteLine("{0}", shape.shape);
            foreach (var bw in shape.BW)
            {
                if(shape.BW.ToList().IndexOf(bw) > 0 )
                {
                    shape.BW.OrderBy(c=>c.quantity == lastGroupBW_Item.quantity).ThenBy(c=>c.quantity);
                }
                Console.WriteLine("{0}|{1}", bw.shape,bw.quantity);
            }
        }
    
    }
    


10 commentaires

Pourquoi ant 10 serait plus élevé que ant 16 et ant 18 ?


Vos deux ensembles de résultats sont complètement égaux. C'est juste pas trié. Demandez-vous comment trier votre liste? Mais quel ordre de tri est 20,10,16,18?


Le résultat n'est pas comme ce que je cherche ... Que cherchez-vous? Quel est le problème et la question ici?


S'il vous plaît expliquer la logique du genre que vous voulez. La première liste est triée par ordre décroissant sur les deux propriétés, la seconde, cependant, a un tri assez étrange sur la propriété de quantité.


@Fabio Désolé pour une réponse tardive, anth 10 supérieure à la fourche 16 et 18e 18 parce que je voudrais trier par la quantité ASC.


Pourquoi avez-vous ant 20 hors de la commande dans votre représentation de la table des envie alors? une faute de frappe? ainsi que mn22 20 ci-dessus mn22 14


@Brettcaswell, je voudrais trier par la "forme" d'abord alors la "quantité". Une fois que la "forme" est triée, la "quantité" sera la suivante. Mais chaque groupe de "forme" que je voudrais trier la "quantité" du dernier élément de ce groupe sera plus élevé la "quantité" du premier élément du groupe suivant. Par exemple comme la deuxième table. Vous pouvez voir que la fourmi 20 sera plus basse le MN11 et le reste de l'élément avec groupe de fourmis aura "Quantité" ASC


@Holger: S'il vous plaît voir mon commentaire sur Brett


@Zohar peled, s'il vous plaît voir mon commentaire sur Bratt.


Eh bien, dans ce cas, les résultats souhaités que vous avez postés sont fausses. Vous allez d'ascendance à la commande descendante à plusieurs reprises dans la propriété Quantité.


5 Réponses :


7
votes

alors éléments avec forme == preshape doit être sur le supérieur ainsi que Quantité == Prequantitaire ; Vous pouvez trier par bool pour ceci (note, que false ): xxx

Démo: (J'ai utilisé tuple pour émuler bw ) xxx

résultat: xxx


4 commentaires

Merci pour votre aide, c'est presque ce que je cherche. La quantité est triée par ASC mais j'aimerais avoir le résultat comme la 2e table de ma question.


Cela ne produit pas la sortie souhaitée. | Mn11 | 20 devrait être 4ème, pas 3ème.


@binh nguyen: Eh bien, alors, s'il vous plaît, vous devez expliquer pourquoi l'ordre souhaité (dans la 2e table) est (mn11, 10) et seulement ( Mn11, 20) . Veuillez noter que 20 est préquantité et c'est pourquoi il semble être sur le top , comme vous avez posé la question. Il semble donc que (mn11, 20), (mn11, 10) est le bon ordre.


@DMITRYYBYCHENKO Merci, j'ai eu la réponse de mon post. Votre tour a fonctionné bien, je peux l'utiliser pour un autre de mes problèmes.




-1
votes
| MN22 | 20       |
| MN22 | 14       |
| MN11 | 10       |
| MN11 | 20       |
| ANT  | 20       |
| ANT  | 18       |
| ANT  | 16       |
| ANT  | 10       |

0 commentaires

2
votes

Je pense que cela suit la spécification.

public class BW
{
    public string shape { get; set; }
    public int quantity { get; set; }
}
class Program
{
    public static void Main(string[] args)
    {
        List<BW> lst = new List<BW>(){
            new BW(){ shape = "MN11", quantity = 20},
            new BW(){ shape = "MN11", quantity = 10},
            new BW(){ shape = "MN22", quantity = 14},
            new BW(){ shape = "MN22", quantity = 20},
            new BW(){ shape = "ANT", quantity = 16},
            new BW(){ shape = "ANT", quantity = 18},
            new BW(){ shape = "ANT", quantity = 20},
            new BW(){ shape = "ANT", quantity = 10}

        };

        string preShape = "MN22";
        int preQuantity = 20;

        // Order by shape first; the everybody gets it part
        var shapeSorted = lst
            .OrderBy(bw => bw.shape != preShape)
            .ThenByDescending(bw => bw.shape);

        // Order gropus by ascending, but if equal to last item in the previous group then first
        var currentSpecialQ = preQuantity;
        var r = new List<BW>();
        foreach(var group in shapeSorted.GroupBy(bw => bw.shape) ) {
          r.AddRange(group.OrderBy(bw => bw.quantity != currentSpecialQ).ThenBy(bw => bw.quantity));
          currentSpecialQ = r.Last().quantity;
        }

        foreach(var bw in r ) Console.WriteLine($"{bw.shape}, {bw.quantity}");

    }
}


1 commentaires

Merci beaucoup, c'est exactement je cherchais.



0
votes

@ la solution de Tymtam est la bonne réponse pour mon post. Merci à tout le monde pour l'aide, j'ai appris plus d'astuce pour utiliser Lambda pour trier par ma liste.


0 commentaires