Jak skipnąć element w .Select( x => {})

0

Chciałbym osiągnąć coś takiego:

Jeżeli nie uda się zparsować, to pomiń ten element

"1 2 4 -5 x 12 -3 4"
.Split(' ')
.Select( x =>
{
	int p;
	return Int32.TryParse(x, out p) ? p : skip_this_one;
})
.ToList()
.ForEach(Console.WriteLine);

Udało mi się to zrobić w ten sposób, ale to raczej jest obejście, a nie rozwiązanie.

"1 2 4 -5 x 12 -3 4"
.Split(' ')
.Select( x =>
{
	int p;
	return Int32.TryParse(x, out p) ? (int?)p : null;
})
.Where(x => x != null)
.ToList()
.ForEach(x => Console.WriteLine(x.Value));

Więc, czy da się pominąć dany element podczas .Select() i gdyby też nie trzeba było się np. dobierać do jego .Value

0

To jest kilkakrotnie szybsze, mimo że trzeba parsować 2 razy

             int h;
            "1 2 4 -5 x 12 -3 4"
            .Split(' ')
            .Where(o => int.TryParse(o, out h))
            .Select(x => Int32.Parse(x))
            .ToList()
            .ForEach(x => Console.WriteLine(x));
0

@kzkzg:

Wywal ; i .Value i będzie działać :D

No dobra, ale to też jest kolejne obejście i w ogóle, że out h działa w ten sposób :O

3

a gdyby tak uzyc super extra csharpowej specjalnosci - extension methods? ;)

public static class StringEx {
	public static IEnumerable<int> ParseInts(this string str, string sep = ' ')
	{
		foreach(string s in str.Split(sep))
		{
			int n;
			if(int.TryParse(s, out n))
			{
				yield return n;
			}
		}
	}
}

i potem pieknie czysto

"1 2 4 -5 x 12 -3 4".ParseInts().ToList().ForEach(Console.WriteLine);

1 użytkowników online, w tym zalogowanych: 0, gości: 1