2017-07-17 35 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

相关问题