Linq запрос, чтобы найти нечисловые элементы в списке? - PullRequest
2 голосов
/ 12 июля 2011

Предположим, у меня есть следующий список:

        var strings = new List<string>();
        strings.Add("1");
        strings.Add("12.456");
        strings.Add("Foobar");
        strings.Add("0.56");
        strings.Add("zero");

Есть ли какой-нибудь запрос, который я могу написать в Linq, который вернет мне только числовые элементы, то есть 1-й, 2-й и 4-й элементы из списка?

-R.

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Попробуйте это:

    double dummy = 0;
    var strings = new List<string>();
    strings.Add("1");
    strings.Add("12.456");
    strings.Add("Foobar");
    strings.Add("0.56");
    strings.Add("zero");
    var numbers = strings.Where(a=>double.TryParse(a, out dummy));
2 голосов
/ 12 июля 2011

Вы можете использовать простой предикат для проверки каждой строки, например:

var strings = new List<string>();
        strings.Add("1");
        strings.Add("12.456");
        strings.Add("Foobar");
        strings.Add("0.56");
        strings.Add("zero");

var nums = strings.Where( s => s.ToCharArray().All( n => Char.IsNumber( n ) || n == '.' ) );
2 голосов
/ 12 июля 2011
strings.Where(s => { double ignored; return double.TryParse(s, out ignored); })

Это вернет все строки, которые могут быть проанализированы как double s как строки.Если вы хотите, чтобы они были числами (что более логично), вы можете написать метод расширения:

public static IEnumerable<double> GetDoubles(this IEnumerable<string> strings)
{
    foreach (var s in strings)
    {
        double result;
        if (double.TryParse(s, out result))
            yield return result;
    }
}

Не забывайте, что double.TryParse() использует вашу текущую культуру, поэтому она даст разные результаты на разныхкомпьютеры.Если вы не хотите этого, используйте double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result).

...