none
Fusionner des éléments consécutifs avec Linq

    Question

  • Bonjour

    je cherche s'il est possible de fusionner des éléments consécutifs d'une collection s'ils ont une propriété commune.

    Ça se fait facilement avec un for, en itérant de la fin vers le début

       class Test
        {
            public Test(string Text, Color MyColor)
            {
                this.Text = Text;
                this.MyColor = MyColor;
            }
    
            public string Text { get; set; }
    
            public Color MyColor { get; set; }
    
            public override string ToString()
            {
                return Text + " in " + MyColor.Name;
            }
        }


                List<Test> myTests = new List<Test>
                {
                    new Test("This ", Color.Black),
                    new Test("is ", Color.Red),
                    new Test("a ", Color.Blue),
                    new Test("sample, ", Color.Blue),
                    new Test("to ", Color.Black),
                    new Test("show ", Color.Black),
                    new Test("what ", Color.Black),
                    new Test("I ", Color.Blue),
                    new Test("want ", Color.Red),
                    new Test("to ", Color.Red),
                    new Test("do.", Color.Blue),
    
                };
    
                int IndexMax = myTests.Count -1;
    
                for (int i = IndexMax; i > 1; i--)
                    if (myTests[i].MyColor == myTests[i-1].MyColor)
                    {
                        myTests[i - 1].Text += myTests[i].Text;
                        myTests.Remove(myTests[i]);
                    }
    

    Résultat

    This  in Black
    is  in Red
    a sample,  in Blue
    to show what  in Black
    I  in Blue
    want to  in Red
    do. in Blue

    Mais par curiosité, j'ai essayé sans succès de faire la même chose avec Linq.

    Si quelqu'un a une solution, je suis preneur.

    Merci d'avance

    samedi 29 octobre 2016 10:59

Toutes les réponses

  • Humm,

    je ne pense pas que ce soit + simple avec linq. La question est : pourquoi vous voulez utiliser Linq alors que votre code fonctionne et est parfaitement lisible et simple ?


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 31 octobre 2016 09:08
  • Bonjour,merci de votre réponse. C'est par curiosité que je cherche s'il est possible de faire cela avec Linq.
    lundi 31 octobre 2016 11:27
  • Peut etre avec un groupBy &co mais ca deviendra illisible et surtout moins performant

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 31 octobre 2016 11:42
  • J'ai essayé quelques options avec groupby, après avoir fait un select indexé, mais soit j'y arrive deux par deux et donc quand il y en a trois de suite ça m donne "to show" et "show what", soit je dois refaire un For dans chaque groupe. Merci quand même.
    lundi 31 octobre 2016 12:25