Подсчет элементов в диапазонах значений с помощью LINQ - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу сделать что-то вроде операции между двумя запросами SQL с помощью LINQ.

У меня есть коллекция фамилий людей.

И еще одна коллекция, содержащая набор начальных и конечных значений фамилий для поиска.

Например, допустим, у меня есть диапазон в таблице, чтобы получить число людей с фамилиями, начинающимися между BA и BE.

var person = dc.Persons.Select(p => p.Surname);
var range = from r in dc.Ranges
            select new 
            {
               ID = r.ID,
               StartRange = r.StartValue,  //e.g. BA
               EndRage = r.EndValue        //e.g. BE
            };

Теперь мне нужно количество людей в каждом диапазоне.

var PersonCount = from r in range
                  select new
                  {
                      r.ID,
                      NumberOfPersonsInRange = person.Where(t => t.Surname >= r.StartRange 
                                                              && t.Surname <= r.EndRage).Count() 
                     //This does not work. Gives error that Operator '>=' cannot be applied to operands of type 'string' and 'string'
              }

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Альтернативой методу CompareTo() (экземпляр) будет использование метода Compare() (статический), который также позволяет указывать логический аргумент для указания сравнение без учета регистра , если хотите.

Этот метод выполняет буквенное сравнение между двумя строками и возвращает -1, если первая строка меньше вторая строка, 0, если они равны , и 1, если первая строка больше второй строки.

Вот пример вашегокод, который делает сравнение без учета регистра, чтобы определить, находится ли фамилия в пределах диапазона (обратите внимание, вы также можете заменить Where на Count):

var personCount = from r in range
    select new
    {
        r.ID,
        NumberOfPersonsInRange = person.Count(p =>
            string.Compare(p.Surname, r.StartRange, true) > -1 &&
            string.Compare(p.Surname, r.EndRange, true) < 1)
    };

Для получения дополнительной информации о сравнении строк, проверьтеИз этой статьи: Как сравнивать строки в C # .


Другой подход заключается в реализации метода расширения для класса string, который содержит этофункциональность, например:

public static class Extensions
{
    public static bool IsInRange(this string value, string start, string end, 
        bool ignoreCase = false)
    {
        return string.Compare(value, start, ignoreCase) > -1 &&
               string.Compare(value, end, ignoreCase) < 1;
    }
}

Это поможет сократить объем кода, который вам нужно написать в вашем выражении Linq:

var personCount = from r in range
    select new
    {
        r.ID,
        NumberOfPersonsInRange = person.Count(p =>
            p.Surname.IsInRange(r.StartRange, r.EndRange, true))
    };
0 голосов
/ 13 сентября 2018

Если я правильно понимаю ваш вопрос, вы можете использовать string.CompareTo метод:

person.Count(t => t.Surname.CompareTo(r.StartRange) >= 0)
                  && t.Surname.CompareTo(r.EndRage) <= 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...