2010-10-07 8 views
2

J'ai Liste de int qui se compose de la valeur 0,0,0,1,2,3,4,0,0 maintenant je divise en 3 listes comme cette liste A consiste 0 , 0,0 et la liste B consiste 1,2,3,4 et la liste C consiste 0,0.Je sais comment diviser en utilisant si et pour, mais comment puis-je le faire en utilisant linq. format habituel je dois diviser en commençant des zéros et au milieu quelques valeurs et en dernier quelques zéros je dois diviser ces premiers zéros dans une liste, les valeurs moyennes dans une liste et les zéros de fin dans une autre liste comme je le dis dans l'exemple ci-dessus en utilisant linq et j'aime aussi prendre l'indice qui valorise.comment diviser la liste en utilisant linq

+3

Vous n'avez pas dit * comment * vous voulez diviser les données. Pourquoi devrait-il être divisé de cette façon plutôt que, disons, {0,0,0,1}, {2,3,4,0}, {0}? –

+0

S'il vous plaît nous donner plus de détails sur les critères utilisés pour diviser. Est-ce juste des séquences séparées de zéros et de non-zéros? – LukeH

+0

Je ne pense pas que vous pouvez – Aliostad

Répondre

7

premier.

myList.TakeWhile(x => x==0) 

deuxième.

myList.SkipWhile(x => x==0).TakeWhile(x => x!= 0) 

troisième.

myList.SkipWhile(x => x==0).SkipWhile(x => x!= 0) 
-1

Vous pouvez utiliser les méthodes Skip et Take exposées par Linq to Objects pour récupérer certains éléments d'une séquence.

var myList = new int[] {0,0,0,1,2,3,4,0,0}; 
var list1 = myList.Take(3); 
var list2 = myList.Skip(3).Take(4); 
var list3 = myList.Skip(7); 
-1

Vous pouvez utiliser Take(n) ou Skip(n) dans LINQ

List<int> list = new List<int>(); 
       list.Add(0); 
       list.Add(0); 
       list.Add(0); 
       list.Add(1); 
       list.Add(2); 
       list.Add(3); 
       list.Add(4); 
       list.Add(0); 
       list.Add(0); 

       var listOne = list.Take(3); 
       var listSecond = list.Skip(3).Take(4); 
       var listThird = list.Skip(7); 
0

Si vous voulez diviser par séquence zéro puis essayez ce code:

static void Main(string[] argv) 
{ 

    var list = new[] { 0, 0, 0, 1, 2, 3, 4, 0, 0 }; 

    int groupIndex = 0; 
    var result = list.Select(
     (e, i) => 
      { 
       if (i == 0) 
       { 
        return new {val = e, group = groupIndex}; 
       } 
       else 
       { 
        groupIndex = 
         (e != 0 && list[i - 1] == 0) || (e == 0 && list[i - 1] != 0) 
          ? 
           groupIndex + 1 
          : groupIndex; 

        return new {val = e, group = groupIndex}; 
       } 
      } 
     ).GroupBy(e => e.group).Select(e => e.Select(o => o.val).ToList()).ToList(); 

    foreach (var item in result) 
    { 
     foreach (var val in item) 
     { 
      Console.Write(val + ";"); 
     } 
     Console.WriteLine(); 
     Console.WriteLine("Count:" + item.Count); 
     Console.WriteLine(); 
    } 

    Console.ReadLine(); 
} 

sortie est:

0;0;0; 
Count:3 

1;2;3;4; 
Count:4 

0;0; 
Count:2 

Il n'est vraiment pas clair quel est le critère de scission de votre question. Si j'ai donné une mauvaise réponse, alors expliquez votre question.

Questions connexes