IQueryable OrderBy / Групповое регулярное выражение

#c# #regex #split #group-by #iqueryable

#c# #регулярное выражение #разделение #групповое по #iqueryable

Вопрос:

У меня есть результат IQueryable с именами, который выглядит примерно так:

 100lbs
10pts
150lbs
11pts
15pt
10pt
  

Я хотел бы сгруппировать результаты по конечным буквам, чтобы результаты выглядели более похоже на это:

 100lbs
150lbs
10pt
15pt
10pts
11pts
  

Возможно ли / как я мог бы использовать регулярное выражение для достижения этого?

Комментарии:

1. Что такое IQuerable поставщик? Я сомневаюсь, что EF / NHibernate поддержал бы что-то настолько сложное.

2. нужно немного больше информации. Доступен ли ваш запрос в памяти (Linq2Objects) или он из LinqToSql или LinqToEntities?

3. Вам также следует подумать о том, чтобы иметь 10 и lbs в отдельных столбцах.

4. Это Linq-to-Entities. Я согласен, что отдельные столбцы были бы лучшим дизайном, к сожалению, я унаследовал это.

Ответ №1:

Я не знаю, как выглядит ваша структура linq, но что вы можете попытаться сделать, так это создать поддельный параметр только для сортировки

что-то вроде

 var result =
    (from c in db.Table 
     select new 
     {
         mainresult = c.mainresult, 
         tempresult ==c.mainresult,

     }
    ).ToList().Select(c=>new{
      mainresult = c.mainresult, 
      tempresult=new string(c.mainresult
             .Where(!char.IsDigit).ToArray())})
    .OrderBy(c=>c.tempresult)
    .Select(c=>c.mainresult)
    .ToList();
  

Комментарии:

1. Вы не можете сделать .Where(!char.IsDigit) .

2. Почему, потому что оно запрашивается?

3. Потому что Operator ! cannot be applied to operand of type 'method group' . Вы хотите .Where(x => !char.IsDigit(x)) .

4. @gunr2171 И, конечно, это , скорее всего, не сможет быть понято поставщиком запросов, даже если это изменение приведет к его компиляции.

Ответ №2:

 var list = new List<string>();
            list.Add("100lbs");
            list.Add("10lbs");
            list.Add("10pts");

            var groupings = list.GroupBy((s)=>{
                if (s.EndsWith("lbs"))//you can use regex here 
                {
                    return "lbs";
                }
                else if (s.EndsWith("lbs"))
                {
                    return "pts";
                }
                return "none";
            },s=>s);
            foreach (var item in groupings)
            {
                item.key will have category "lbs"/"pts" 
            }
  

Комментарии:

1. Помните, это, скорее всего, должно исходить из базы данных, что означает, что запрос выполняется из Entity Framework или NHibernate. Знает ли sql, что EndsWith такое?

2. Я надеюсь, что это поможет вам начать. используйте регулярное выражение вместо EndsWith. Вы можете получить результаты в отдельный список, а затем обработать, да, EF / Nhibernate также не знает EndsWith или regex.