2015-01-28 6 views
1

У меня есть этот класс C#:Группировка данных в пределах определенного диапазона

public class Option 
{ 
    public int OptionId { get; set; } 
    public string OptionName { get; set; } 
    public string OptionType { get; set; } //Three different types A,B,C 
    public int SortOrder { get; set; } //100-199, 200-299, etc. 
} 

GetOptions возвращает один вариант массива [].

Теперь то, что я хочу:

Первая: группа опций по OptionType

Тогда: Группировать элементы в первой группе по SortOrder, с условием, что вариант с SortOrder между 100-199 должны быть в одном группа, 200-299 в другой и т. д.

Я могу сделать первый, как:

IEnumerable<IGrouping<string, Option>> groupedOptions = 
         from option in options 
         group option by option.OptionType; 

или это

var groupedOptions2 = options.GroupBy(p=>p.OptionType); 

Во-вторых, я не знаю, как. Я попытался добавить еще один GroupBy, но это не сработало. Конечно, что-то не так.

Спасибо.

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

я получаю варианты, используя первый запрос я выше: groupedOptions

привязывание его к Repeater. Отобразите OptionType в этом повторителе. В DataBound случае повторителя я другая группировка:

IGrouping<OptionType, Option> itm =(IGrouping<OptionType, Option>) e.Item.DataItem; 
IEnumerable<IGrouping<int, Option>> nestedGroupedOptions = 
    from option in itm 
    group option by option.SortOrder/100; 

Тогда я связывание, что к внутреннему ретранслятора, который имеет CheckBoxList. Вот моя вся тестовая страница .aspx. Это отдельная страница и ее можно протестировать, отбросив ее на веб-сайте asp.net webforms.

<%@ Page Language="C#" %> 

<!DOCTYPE html> 

<script runat="server"> 
    Dictionary<int, string> OptionGroupNames = null; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     OptionGroupNames = GetOptionGroupNames(); 
     DisplayDrinks(); 
    } 

    public void DisplayDrinks() 
    { 
     Option[] options = GetOptions(); 


     IEnumerable<IGrouping<OptionType, Option>> groupedOptions = 
        from option in options 
        group option by option.OptionType; 

     rptrGroupOptions.DataSource = groupedOptions; 
     rptrGroupOptions.DataBind(); 

    } 

    protected void rptrGroupOptions_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      IGrouping<OptionType, Option> itm = (IGrouping<OptionType, Option>)e.Item.DataItem; 
      Label lblHeader = e.Item.FindControl("lblOptionGroup") as Label; 

      Repeater rptrOptions = e.Item.FindControl("rptrOptions") as Repeater; 

      lblHeader.Text = itm.Key.ToString(); 

      IEnumerable<IGrouping<int, Option>> groupedOptions = 
         from option in itm 
         group option by option.SortOrder/100; 

      rptrOptions.DataSource = groupedOptions; 
      rptrOptions.DataBind(); 

     } 
    } 

    protected void rptrOptions_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      IGrouping<int, Option> itm = (IGrouping<int, Option>)e.Item.DataItem; 
      CheckBoxList cbl = e.Item.FindControl("cblOptions") as CheckBoxList; 
      Label lblOptionGroup = e.Item.FindControl("lblOptionGroupNum") as Label; 

      if (itm.Key != 1 && itm.Key != 2) 
      { 

       lblOptionGroup.Text = OptionGroupNames.First(p => p.Key == itm.Key).Value; 
      } 
      cbl.DataSource = itm; 
      cbl.DataBind(); 
     } 
    } 

    public Option[] GetOptions() 
    { 
     var Options = new Option[]{ 
       new Option{OptionId=1, DisplayName="Green", OptionType = OptionType.Tea, SortOrder=100}, 
       new Option{OptionId=2, DisplayName="Black", OptionType = OptionType.Tea, SortOrder=101}, 

       new Option{OptionId=3, DisplayName="French", OptionType = OptionType.Coffee, SortOrder=202}, 
       new Option{OptionId=4, DisplayName="Espresso", OptionType = OptionType.Coffee, SortOrder=206}, 
       new Option{OptionId=4, DisplayName="Cappuccino", OptionType = OptionType.Coffee, SortOrder=250}, 

       new Option{OptionId=1, DisplayName="Coke", OptionType = OptionType.Drinks, SortOrder=300}, 
       new Option{OptionId=2, DisplayName="Pepsi", OptionType = OptionType.Drinks, SortOrder=301}, 
       new Option{OptionId=3, DisplayName="Sprite", OptionType = OptionType.Drinks, SortOrder=302}, 

       new Option{OptionId=4, DisplayName="Apple Juice", OptionType = OptionType.Drinks, SortOrder=406}, 
       new Option{OptionId=1, DisplayName="Orange Juice", OptionType = OptionType.Drinks, SortOrder=400}, 

       new Option{OptionId=2, DisplayName="Wine", OptionType = OptionType.Drinks, SortOrder=501}, 
       new Option{OptionId=3, DisplayName="Beer", OptionType = OptionType.Drinks, SortOrder=502}, 
       new Option{OptionId=4, DisplayName="Rum", OptionType = OptionType.Drinks, SortOrder=520} 
      }; 

     return Options.ToArray(); 
    } 

    public static Dictionary<int, string> GetOptionGroupNames() 
    { 
     Dictionary<int, string> optionGroups = new Dictionary<int, string>(); 
     optionGroups.Add(1, "Tea"); 
     optionGroups.Add(2, "Coffee"); 
     optionGroups.Add(3, "Soda"); 
     optionGroups.Add(4, "Juice"); 
     optionGroups.Add(5, "Alcohol"); 

     return optionGroups; 
    } 

    public class Option 
    { 
     public int OptionId { get; set; } 
     public string DisplayName { get; set; } 
     public OptionType OptionType { get; set; } //Three different types A,B,C 
     public int SortOrder { get; set; } //100-199, 200-299, etc. 
    } 

    public enum OptionType 
    { 
     Coffee, 
     Tea, 
     Drinks 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:Repeater ID="rptrGroupOptions" runat="server" OnItemDataBound="rptrGroupOptions_ItemDataBound"> 
      <ItemTemplate> 
       <asp:Label ID="lblOptionGroup" runat="server" ForeColor="Maroon"></asp:Label><br /> 
       <asp:Repeater ID="rptrOptions" runat="server" OnItemDataBound="rptrOptions_ItemDataBound"> 
        <ItemTemplate> 
         <asp:Label ID="lblOptionGroupNum" runat="server" ForeColor="Sienna"></asp:Label> 
         <asp:CheckBoxList ID="cblOptions" runat="server" DataTextField="DisplayName" DataValueField="OptionId"></asp:CheckBoxList> 
        </ItemTemplate> 
       </asp:Repeater> 
       <br /> 
       </ItemTemplate> 
     </asp:Repeater> 
    </div> 
    </form> 
</body> 
</html> 

Извините, я все еще пытаюсь заполучить Linq и GroupBy.

+4

'GroupBy (x => x.SortOrder/100)'? – EZI

+0

@ EZ1 попробовал это, но у меня возникли проблемы, поскольку я пытаюсь отобразить OptionType как заголовок, а OptionName привязывается к списку флажков. – gbs

ответ

1

Я хотел бы сделать это следующим образом:

options.GroupBy(x => new { x.OptionType, Group = x.SortOder/100 }) 

Вы получите ключевые объекты, такие как ("A", 1) ("B", 1) ("B", 2) с исходным объектом в качестве значения.

+0

Очень творческий ответ :) – I4V

+0

Я пытаюсь это, но я действительно хочу привязать значения к элементу управления ретранслятора asp.net, который внутри него имеет элементы управления CheckBox. Я надеялся передать его IGrouping , я не так, как анонимный метод. – gbs

0

Я думаю, что вы могли бы сделать что-то вроде этого:

var result= options.ToLookup(o => o.OptionType). 
       ToDictionary(grouping => grouping.Key, grouping => grouping. 
       ToLookup(o => o.SortOder/100)); 

Таким образом, у вас есть словарь, где ключ является OptionType и значение представляет собой группу Option в соответствии диапазон значений.

+0

Он действительно группируется, но как бы привязать результаты к элементу управления, скажем, с помощью checkboxlist, а другой - с выпадающим списком, который находится внутри ретранслятора. Я продолжаю получать странные ошибки при бросании. Я считаю, что это связано с чтением ценностей. – gbs

+0

Какая технология вы используете? Я думаю, вы должны создать новый вопрос, задающий сомнения со связанными тегами. Таким образом, многие люди могут помочь вам в этом вопросе сейчас, когда вы знаете, как создавать группы. – octavioccl

+0

Это asp.net, и я обновил свой код, который работает. Просто не знаю, правильна ли группировка, которую я делаю. – gbs

Смежные вопросы