2017-07-17 36 views
0

我有一個字符串list和數字pageSizepageNumberrowNumber的列表。我想按頁面大小拆分這個列表,並創建一個list的列表,然後返回給定的pageNumberrowNumber處的元素。如果頁碼和行號高於可能的索引級別,則返回nullpageNumberrowNumber都是從零開始的索引。如何將列表拆分爲知道大小的塊,然後找到一個項目?我是新來的c#

例子:

list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 
pageSize = 3 
pageNumber = 2 
rowNumber = 1 
Result:List = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10]] 
Result = 8. 

但這段代碼是拋出一個異常OutOfRange:

public static int? GetItemInThePagedDataList(IEnumerable<int> list, int pageSize, int pageNumber, int rowNumber) 
{ 
    var lists = list.Chop(pageSize); 
    if (pageNumber >= lists.Count() || rowNumber >= lists.First().Count()) 
    { 
     throw new ArgumentOutOfRangeException(); 
    } 
    return lists.ElementAt(pageNumber).ElementAt(rowNumber); 
} 
+0

沒有必要拆分原始列表。你可以使用公式index = pageSize * pageNumber + rowNumber。 – juharr

+1

[在linq創建批次]可能的重複(https://stackoverflow.com/questions/13731796/create-batches-in-linq) – mjwills

回答

1

這是凱末爾解決方案的一個變種。如果頁碼和行號高於可能的索引級別,則此實現將返回null。我還實施了兩次(一次爲IEnumerable,一次爲IList),以便List方案的性能得到顯着改善。

using System; 
using System.Collections.Generic; 
using System.Linq; 

class Program 
{ 
    public static int? GetItemInThePagedDataList(IEnumerable<int> list, int pageSize, int pageNumber, int rowNumber) 
    { 
     var index = (pageSize * pageNumber) + rowNumber; 
     var nullableList = list.Select(z => (int?) z); 
     return index < 0 ? null : nullableList.ElementAtOrDefault(index); 
    } 

    public static int? GetItemInThePagedDataList(IList<int> list, int pageSize, int pageNumber, int rowNumber) 
    { 
     var index = (pageSize * pageNumber) + rowNumber; 
     return (index >= list.Count || index < 0) ? (int?)null : list[index]; 
    } 

    static void Main(string[] args) 
    { 
     var list = new List<int> {1, 2, 3, 4}; 
     IEnumerable<int> items = list; 

     Console.WriteLine(GetItemInThePagedDataList(list, 2, 1, 1)); 
     Console.WriteLine(GetItemInThePagedDataList(items, 2, 1, 1)); 
     Console.WriteLine(GetItemInThePagedDataList(list, 2, 4, 1)); 
     Console.WriteLine(GetItemInThePagedDataList(items, 2, 4, 1)); 
     Console.WriteLine(GetItemInThePagedDataList(list, 2, -1, 1)); 
     Console.WriteLine(GetItemInThePagedDataList(items, 2, -1, 1)); 
    } 
} 
+0

非常感謝你們,這是我們名單上的最後一項練習。我還有另外兩名學員在這裏,他們也正在發送他們的問候。我們真的無法弄清楚,再次謝謝。 :)(一)mjwills和@kemal –

+0

再次感謝你,現在我知道如何接受解決方案:) –

1

不需要拆分列表。寫一個像這樣的函數並返回索引處的元素。

public static int? GetItemInThePagedDataList(IEnumerable list, int pageSize, int pageNumber, int rowNumber) 
{ 
    int index = (pageSize * pageNumber) + rowNumber; 
    return list.ElementAt(index); 
} 
+0

@ kemal guler,我已經嘗試了你的代碼kemal,我得到了同樣的異常(outofreach ) –

+0

不要將您的列表類型作爲IEnumerable發送。將類型發送爲var或字符串。 @羅伊古茲曼 –

+0

@mjwills:那麼你在倡導什麼? '.Skip(索引1)。首先()'? – Flater

相關問題