GroupBy等效于Windows Phone

时间:2014-01-31 04:53:23

标签: c# windows-8 windows-phone-8

我目前正在创建Win8&使用共享可移植类库的Wp8应用程序。我做的第一件事就是获得一份优惠清单。

public class Offer
{
    string category;
    ....
}

这些优惠中的每一个都分配了有限数量的类别之一。在我的Win8应用程序中,一旦我获得了优惠列表,我就可以通过category对这些优惠进行分组。

var groupedOffers = offers.Items.GroupBy(item => item.category).OrderBy(item => item.Key.ToString());

不幸的是,Wp8中没有相同的功能,否则它并不明显。任何人都知道如何在没有明确循环和创建组的情况下实现相同的目标吗?

2 个答案:

答案 0 :(得分:1)

var group = from p in offers.Items                        
group p by p.category into g
                    select g

offers.Items = group.ToList<Item>()

希望这会对你有所帮助,或至少给你一些想法

答案 1 :(得分:1)

确保你的班级顶部有'使用System.Linq'。

这可能是查询提供程序强加的限制。试试这个:

var groupedOffers = offers.Items
      .GroupBy(item => item.category)
      .AsEnumerable()
      .OrderBy(item => item.Key.ToString());

或者这个:

var groupedOffers = offers.Items
      .AsEnumerable()
      .GroupBy(item => item.category)
      .OrderBy(item => item.Key.ToString());

AsEnumerable()将使查询的其余部分作为Linq-to-Objects进行处理。这可能会带来负面的性能,IO和/或内存损失,但它有时是必要的。例如,假设您正在对SQL Server使用EF。

  1. var newborns = Context.People.Where(x =&gt; x.DateOfBirth.CompareTo(today)== 0);
  2. var newborns = Context.People.AsEnumerable()。其中​​(x =&gt; x.DateOfBirth.CompareTo(今天)== 0);
  3. 第一个查询将被翻译成类似于“SELECT * FROM People WHERE DateOfBirth ='2014-01-31'”的内容,其中第二个将转换为“SELECT * FROM People”。然后LINQ将过滤整组人员,只产生DateOfBirth.CompareTo(今天)== 0的结果。如果数据库包含大量数据,住在远处的数据中心等,这意味着整个流式传输回答1个简单查询的数据集。 1将更高效b / c过滤将在源发生,只有匹配的数据将流回您的.NET代码。

    如果没有AsEnumerable,LINQ查询提供程序可以尝试将LINQ表达式转换为对您正在查询的系统有意义的查询(SQL Server数据库,MySQL,LDAP,WMI等)。一些查询提供程序和/或它们的底层系统对它们可以支持的查询类型施加了限制。

    作为可能不能很好地转换(并且需要AsEnumerable或ToArray)的事物的示例,想象一下WHERE子句中的复杂表达式,这对查询提供者来说不容易翻译。

    var happyBirthday = Context.People.Where(x => x.DateOfBirth.Month == DateTime.Now.Month && x.DateOfBirth.Day == DateTime.Now.Day);
    

    也许有些提供程序会将此表达式转换为SQL,但其他提供程序会拒绝它。他们不知道如何翻译DateTime.Now.Month和DateTime.Now.Day,他们可能会在DateOfBirth字段上查看.Month和.Day查找。