Windows 8 Store App和Linq

时间:2012-10-27 23:07:20

标签: c# linq windows-8 store

下面的代码段来自c#和xaml中的Windows 8商店应用。 我已经将这些代码放在网上的各种样本中,所以这可能不是最好的方法。其中大部分来自VS2012中提供的Grid模板,我将我的web api作为数据源连接起来

请解释以下

当我调用Get方法时,一切正常,我将数据恢复到xaml视图中 当我以相同的方法取消注释Take(10)时,我没有得到任何数据。

似乎任何尝试放置LINQ变种的扩展方法只会停止返回的数据,也没有说明原因,它符合要求!

任何帮助表示赞赏

由于 标记

public class TeamDataSource
{
    private static TeamDataSource _sampleDataSource = new TeamDataSource();

    private ObservableCollection<TeamDataItem> _items = new ObservableCollection<TeamDataItem>();
    public ObservableCollection<TeamDataItem> Items
    {
        get { return this._items; }
    }

    public TeamDataSource()
    {
        this.Initialize();
    }

    public static IEnumerable<TeamDataItem> Get()
    {
        var thisdata = _sampleDataSource.Items;
        return thisdata;//.Take(10);
    }

    private async void Initialize()
    {
        using (var client = new DataServiceClient())
        {
            List<TeamDataItem> list = await client.Download<List<TeamDataItem>>("/teams");

            foreach (var i in list.OrderByDescending(t => t.Points).ThenByDescending(t => t.GoalDiff))
            {
                TeamDataItem team = i;
                _items.Add(team);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您的问题是Take没有立即枚举这些项目。它推迟枚举,直到在其上调用foreach或在其上调用GetEnumerator。在这种情况下,它枚举的集合被处理(一旦Get内容结束),所以当它最终枚举项目时,就不再有项目了。尝试在返回语句之前添加thisdata.GetEnumerator();作为一行。

来自here

  

此方法通过使用延迟执行来实现。眼前的   返回值是存储所有信息的对象   需要执行操作。此方法表示的查询   在通过调用对象枚举对象之前不会执行   直接使用GetEnumerator方法或在Visual C#或For中使用foreach   每个都在Visual Basic中。

答案 1 :(得分:0)

最终看起来很明显。当我使用aync和await时,调用在数据到达之前立即返回。因此Take(4)没有任何工作。

现在唯一的问题是我什么时候可以告诉任务已经完成?