2013-04-30 2 views
2

Disons que j'ai une liste comme ceci:Somme toute une gamme de ints dans une liste

List<string> _lstr = new List<string>(); 

     _lstr.Add("AA"); 
     _lstr.Add("BB"); 
     _lstr.Add("1"); 
     _lstr.Add("7"); 
     _lstr.Add("2"); 
     _lstr.Add("5"); 

Comment résumer les entiers dans la liste si je ne sais pas combien entiers sont dans la liste ? Pourrait être 4, pourrait être 10, etc ... Tout ce que je sais, c'est que les deux premiers éléments sont des chaînes, le reste sont des entiers. Dans ce cas, le résultat souhaité est .

+0

Qu'avez-vous essayé? Avez-vous essayé de résoudre ce problème vous-même? Savez-vous comment valider si une chaîne peut être analysée en entier? – Servy

Répondre

5

Méthode A saute Unconditionally le premier 2 et assume les autres sont toutes les chaînes entières:

var sum = _lstr.Skip(2).Select(int.Parse).Sum(); 

Méthode B ne fait aucune assumtions:

var sum = _lstr.Aggregate(0, (x, z) => x + (int.TryParse(z, out x) ? x : 0)); 
1

très facilement:

list.Skip(2).Select(int.Parse).Sum(); 
1
var sum = _lstr.Skip(2).Sum(s => int.Parse(s)); 
4

sans faire l'hypothèse que deux premiers éléments sont des chaînes

int sum = _lstr.Select(s => {int i; return int.TryParse(s,out i) ? i : 0; }) 
       .Sum(); 
+1

+1 pour l'approche sans hypothèses. Les hypothèses sont souvent fausses –

1
int num = 0; int sum = 0; 
_lstr.ForEach(x => {Int32.TryParse(x, out num); sum +=num;}); 

juste pour prouver le point que si Int32.TryParse ne l'est sur var resetted à zéro

_lstr.Add("AA"); 
_lstr.Add("BB"); 
_lstr.Add("1"); 
_lstr.Add("7"); 
_lstr.Add("2"); 
_lstr.Add("5"); 
_lstr.Add("CC"); 
_lstr.Add("9"); 

int num = 0; int sum = 0; 
foreach(string s in _lstr) 
{ 
    bool result = Int32.TryParse(s, out num); 
    Console.WriteLine("TryParse:" + result + " num=" + num); 
} 

TryParse:False num=0 
TryParse:False num=0 
TryParse:True num=1 
TryParse:True num=7 
TryParse:True num=2 
TryParse:True num=5 
TryParse:False num=0 
TryParse:True num=9 
+0

mais en cas de faux num = 0, essayez d'ajouter une autre chaîne et un autre entier après le dernier entier – Steve

+0

Excuses, c'est 'out', donc il faut changer la valeur - êtes-vous sûr qu'il la met à 0 ? Je ne trouve aucune documentation à cet effet. – VisualMelon

+0

@Steve Je ne suis pas le downvoter, mais personnellement, je n'aime pas beaucoup utiliser Linq avec des effets secondaires. –

-5
int sum=0,i=0;  
foreach(string s in mylist){ 
    //in case of non integers 
    try{ 
     i=int.parse(s);//you can put convert or tryparse too here 
    } catch(Exception ex) { 
     i=0; 
    } 
    sum=sum+i; 
} 

return sum; 
+0

Parce que cela ne fonctionne pas. L'OP a une liste de chaînes, qui ne sont pas toutes des entiers. – Servy

+0

avez-vous vu la réponse éditée avant downvoting moi – Alok

+0

Yep. Ça ne marche toujours pas. – Servy

Questions connexes