2012-12-03 64 views
2

我有一個類型爲IEnumerable(非泛型)的數據源的自定義控件。現在我想要在數據源上實現分頁,所以我需要類似Skip和Take的List-of-T。現在,我使用下列內容:IEnumerable跳過並採取

List<object> pagingList = DataSource.Cast<object>().ToList() 

這可能是低效的,我猜,所以我在尋找一個更好的方式來做到這一點。枚舉集合,跳過元素等與兩個計數器可能會更有效率,但它是如此醜陋,我只是不想這樣做。但也許這是最好的選擇?

回答

8

你爲什麼打電話給ToList()?您可以使用SkipTake不說:

IEnumerable<object> paged = DataSource.Cast<object>() 
             .Skip(page * pageSize) 
             .Take(pageSize); 

,將節省整個數據源轉化成清單 - 但它確實意味着當源不是IList<T>你不能有效地跳過。雖然

兩個重要的問題:

  • 你提到你你原來的代碼是低效的...你測量的?這個數據有多大,它的內存形式是什麼?你還在用它做什麼?這真的是一個瓶頸嗎?收集事實而不是猜測。
  • 如果您有一個通用數據源,那麼以各種方式使用您的數據會更容易......您可以實現哪些功能?
+0

好的,所以現在我只是創建一個額外的副本:)謝謝! –

+0

@EladLachmi:我不確定你的意思。迭代上面的查詢不會創建整個頁面的內存中副本。它只會一次產生一個值。 –

+0

你的權利。抱歉。 –

1

鑑於LINQ擴展方法的實施方式,我不認爲這樣做效率太低。如果你真的想,你可以實現IEnumerable的擴展方法Skip()Take(),但我不認爲這是必要的。

這是一個好主意,嘗試使用代碼對讀取它的人最有意義的方法,然後返回並更改它,如果發現執行不當並且分析人員說這部分是罪魁禍首。

相關問題