Группировка строк по первому символу (буквенно-цифровая) - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть список строк (названий продуктов), из которых мне нужно создать индекс продукта (на основе первого символа имени продукта) в форме "0-9", "A", "B",... "Z".

Я делаю это:

Products.GroupBy(p => p.Name[0].ToUpper())

Но это не работает для названий продуктов, которые начинаются с "0" .. "9".

Как изменить запрос, чтобы сгруппировать все альфы в разные группы ("A" .. "Z"), а также все цифры в одну группу ("0-9")?

1 Ответ

7 голосов
/ 22 сентября 2011

Вы не сказали, используете ли вы LINQ to SQL или LINQ to Objects или что-то еще. В LINQ to Objects я бы, вероятно, использовал:

Products.GroupBy(p = {
    char c = p.Name[0];
    return c >= '0' && c <= '9' ? '0' : char.ToUpper(c);
});

(Обратите внимание, что ToUpper, кстати, чувствителен к культуре - неясно, хотите вы этого или нет.)

В LINQ to SQL (где блочные лямбды нельзя использовать, так как они не могут быть преобразованы в деревья выражений), я бы, вероятно, использовал предложение let, чтобы сделать то же самое по-другому:

var query = from product in products
            let c = product.Name[0]
            group product by c >= '0' && c <= '9' ? '0' : char.ToUpper(c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...