2012-10-27 208 views
0

下面的代码片段来自c#和xaml中的Windows 8商店应用程序。 我把这些代码放在了网页上的各种样本中,所以这可能不是最好的方法。它的大部分是从VS2012提供的网格模板,我已经迷上了我的Web API作为数据源Windows 8商店应用程序和Linq

请解释下

当我打电话Get方法都工作正常,我得到的数据回到xaml视图 当我取消注释采取(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); 
      } 
     } 
    } 
} 
+0

does。Take(10).ToList ()工作? –

+0

不,我不害怕 –

回答

0

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

here

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

+0

这没有什么区别。我想知道它是否与异步/等待有关。我知道什么时候这通常发生在做一个ToList()时,当查询仍然处于延迟状态时,可以让你迭代一些东西。 –

0

似乎这是相当明显的最后。当我使用aync并等待时,呼叫在数据到达之前立即返回。因此Take(4)没有任何工作。

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

相关问题