0

下面的代码片段来自 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);
            }
        }
    }
}
4

2 回答 2

0

好像最后还是很明显的。当我使用 aync 和 await 时,调用在数据到达之前立即返回。因此 Take(4) 没有什么可做的。

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

于 2012-10-29T21:59:24.450 回答
0

您的问题是Take不会立即枚举项目。它推迟枚举,直到它foreach被调用或被GetEnumerator调用。在这种情况下,它正在枚举的集合被释放(一旦Get内容结束),因此当它最终枚举项目时,不再有任何项目。尝试thisdata.GetEnumerator();在 return 语句之前添加一行。

这里

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

于 2012-10-28T05:09:33.370 回答