Группировка, избегающая анонимных типов

#c# #anonymous-types #igrouping

Вопрос:

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

Пример:

У нас есть занятие

 public class Customer
{
    public string Name { get; set; }

    public int Age { get; set; }

    public string Location { get; set; }

    public char Genre { get; set; }
}
 

И с помощью флажка в списке вы можете выбрать параметры для группировки данных, где параметры будут:

  • Имя
  • Возраст
  • Расположение
  • Жанр

Таким образом, у нас может быть от 1 до 4 ключей для группировки данных.

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

Я хочу избежать:

  public IGrouping<object,Customer> GetGroups(IEnumerable<Customer> data)
 {
    if("Name is selected")
    {
        return data.GroupBy(e => e.Name);
    }
    if("Name and Age are selected")
    {
        return data.GroupBy(e => new { e.Name, e.Age });
    }
}
 

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

1. Можете ли вы добавить какой-нибудь код?

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

3. Вам, вероятно, нужно взглянуть на IQueryable, docs.microsoft.com/en-us/dotnet/api/…

4. Я имею в виду… возможно , вы могли бы использовать return Tuple.Create(e.Name, e.Age) , но… если что — то теряет информацию по сравнению с анонимными типами, как сейчас, все, что вы знаете, это то, что оно возвращает a string и int (или что-то еще) — не то, что это string такое… чего ты здесь пытаешься избежать?

Ответ №1:

Не уверен, что это то, что вы ищете, но может быть полезно:

 return data.GroupBy(g =>
  new {
    Name = includeName ? g.Name : null,
    Age = includeAge ? g.Age : null,
    ... 
  });
 

Ответ №2:

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

     bool groupByName = false;
    bool groupByAge = false;
    bool groupByLocation = false;
    bool groupByGenre = true;
    
    var result = from x in items
                 group x by new { 
                                    Name = (!groupByName ? "" : x.Name), 
                                    Age = (!groupByAge ? 0 : x.Age),
                                    Location = (!groupByLocation ? "" : x.Location),
                                    Genre = (!groupByGenre ? ' ' : x.Genre)
                                } 
                                    into g
                 select g;