2012-07-02 2 views
3

Je commence juste avec LINQ, et j'ai quelques problèmes.Linq avec des méthodes anonymes

Dire que je voulais faire quelque chose comme ceci:

IEnumerable<String[]> = from s in listOfStrings 
         where() => { 
          int sum = 0; 
          for (int i=0; i<s.Length(); i++) 
          { 
           sum += s[i]; 
          } 
          return sum < 50; 
         } 
         select() => 
         { 
          String[] t = new String[s.Length()]; 
          for (int i=0; i<s.Length(); i++) 
          { 
           t[i] = s[i].toString(); 
          } 
          return t; 
         } 

Fondamentalement, je veux obtenir un tableau de caractères sous forme de chaîne dans de chaînes en listOfStrings qui ont une somme inférieure à 50.

Cette est juste un exemple, il serait difficile de penser à une fonction plus inutile, j'essaie juste de trouver comment exécuter des choses dans les fonctions lambda dans linq, sans faire de nouvelle fonction pour le faire.

Merci!

+0

Vous semble mélanger la syntaxe de requête avec la syntaxe d'appel de méthode. – leppie

+1

Est-ce que votre 'listOfStrings' type' Liste 'ou' Liste '? –

+0

@tsukimi La fonction ne calcule pas la longueur, elle calcule la somme de tous les caractères – AStupidNoob

Répondre

2

Si vous utilisez la syntaxe de méthode enchaînant au lieu de la syntaxe de requête (par exemple listOfStrings.Where(...)), vous pouvez coller le lambda là-dedans.

+0

OK, je vais regarder ça, mais quelle est la différence de base? – AStupidNoob

+0

Je l'ai maintenant. Fonctionne bien, merci! :RÉ – AStupidNoob

1

Utiliser des fonctions lambda est probablement plus facile dans ce cas ...

var listOfStrings = new List<string>() { "foo", "bar" }; 
IEnumerable<string[]> result = 

    // restrict to strings where the sum of ASCII values is < 1000 
    listOfStrings.Where(item => item.Sum(ch => (int)ch) < 1000) 

    // select each as an array of strings 
    .Select(item => item.Select(ch => ch.ToString()).ToArray()); 

// result: { { "f", "o", "o" }, { "b", "a", "r" } } 
-1

Peut-être:

listOfString.Where(s => s.Length < 50).ToArray(); 
1

Je pense que quelque chose comme cela pourrait vous aider, je ne l'ai pas compilé de sorte qu'il pourrait être un bug dans le code, mais les concepts sont là:

var result = listOfStrings.Where(y => y.Split().Aggregate(0, (y, x) => int.Parse(y)) < 50).Select(y => y.Split()); 
Questions connexes