আপনি কিভাবে দেওয়া আপনি একটি আছে LINQ একটি সংগ্রহের মাধ্যমে পৃষ্ঠা না startIndexএবং count?
আপনি কিভাবে দেওয়া আপনি একটি আছে LINQ একটি সংগ্রহের মাধ্যমে পৃষ্ঠা না startIndexএবং count?
উত্তর:
কয়েক মাস আগে আমি ফ্লুয়েন্ট ইন্টারফেস এবং লিনকিউ সম্পর্কে একটি ব্লগ পোস্ট লিখেছিলাম যা IQueryable<T>একটি লাইনকিউ সংগ্রহের পৃষ্ঠাবদ্ধকরণের নিম্নলিখিত প্রাকৃতিক উপায়ে সরবরাহ করার জন্য একটি এক্সটেনশন পদ্ধতি এবং অন্য শ্রেণি ব্যবহার করে ।
var query = from i in ideas
select i;
var pagedCollection = query.InPagesOf(10);
var pageOfIdeas = pagedCollection.Page(2);
আপনি এমএসডিএন কোড গ্যালারী পৃষ্ঠা থেকে পাইপলাইনগুলি, ফিল্টারগুলি, ফ্লুয়েন্ট এপিআই এবং লিনকিউ থেকে এসকিউএল এ কোড পেতে পারেন ।
এটি Skipএবং Takeএক্সটেনশন পদ্ধতিগুলির সাথে খুব সহজ ।
var query = from i in ideas
select i;
var paggedCollection = query.Skip(startIndex).Take(count);
আমার নিজের প্যাগেইনেটরটি তৈরি করার মতো অন্যদের যা আছে তার চেয়ে আমি এটি কিছুটা আলাদাভাবে সমাধান করেছি, একটি রিপিটার দিয়ে। সুতরাং আমি যে আইটেমগুলি পেয়েছি সেগুলির সংগ্রহের জন্য আমি প্রথম পৃষ্ঠা নম্বরের একটি সংকলন তৈরি করেছি:
// assumes that the item collection is "myItems"
int pageCount = (myItems.Count + PageSize - 1) / PageSize;
IEnumerable<int> pageRange = Enumerable.Range(1, pageCount);
// pageRange contains [1, 2, ... , pageCount]
এটি ব্যবহার করে আমি সহজেই আইটেম সংগ্রহকে "পৃষ্ঠাগুলি" সংকলনে ভাগ করতে পারি। এই ক্ষেত্রে একটি পৃষ্ঠা হ'ল আইটেমগুলির সংগ্রহ ( IEnumerable<Item>)। উপরের তৈরি থেকে সূচকটি নির্বাচন করে আপনি এটি ব্যবহার করে Skipএবং Takeএকসাথে এটি করতে পারেন pageRange:
IEnumerable<IEnumerable<Item>> pageRange
.Select((page, index) =>
myItems
.Skip(index*PageSize)
.Take(PageSize));
অবশ্যই আপনাকে প্রতিটি পৃষ্ঠাকে একটি অতিরিক্ত সংগ্রহ হিসাবে পরিচালনা করতে হবে তবে উদাহরণস্বরূপ যদি আপনি পুনরাবৃত্তিকারীদের বাসা বাঁধেন তবে এটি হ্যান্ডেল করা সহজ।
এক-লাইনের TLDR সংস্করণ এই হতে হবে:
var pages = Enumerable
.Range(0, pageCount)
.Select((index) => myItems.Skip(index*PageSize).Take(PageSize));
যা এটি হিসাবে ব্যবহার করা যেতে পারে:
for (Enumerable<Item> page : pages)
{
// handle page
for (Item item : page)
{
// handle item in page
}
}
এই প্রশ্নটি কিছুটা পুরানো, তবে আমি আমার পেজিং অ্যালগরিদম পোস্ট করতে চেয়েছিলাম যা পুরো পদ্ধতিটি (ব্যবহারকারীর ইন্টারঅ্যাকশন সহ) দেখায়।
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;
int took = 0;
bool getNextPage;
var page = ideas.Skip(startIndex);
do
{
Console.WriteLine("Page {0}:", (took / pageSize) + 1);
foreach (var idea in page.Take(pageSize))
{
Console.WriteLine(idea);
}
took += pageSize;
if (took < count)
{
Console.WriteLine("Next page (y/n)?");
char answer = Console.ReadLine().FirstOrDefault();
getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);
if (getNextPage)
{
page = page.Skip(pageSize);
}
}
}
while (getNextPage && took < count);
তবে, আপনি যদি পারফরম্যান্সের পরে এবং প্রোডাকশন কোডে থাকেন তবে আমরা সবাই পারফরম্যান্সের পরে আছি, উপরে বর্ণিত লিঙ্কের পেজিংটি ব্যবহার করা উচিত নয়, বরং IEnumeratorনিজেকে পেজিং বাস্তবায়নের জন্য অন্তর্নিহিত ব্যবহার করা উচিত । প্রকৃতপক্ষে, এটি উপরে প্রদর্শিত লিনকিউ-অ্যালগরিদমের মতোই সহজ, তবে আরও অভিনয়:
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;
int took = 0;
bool getNextPage = true;
using (var page = ideas.Skip(startIndex).GetEnumerator())
{
do
{
Console.WriteLine("Page {0}:", (took / pageSize) + 1);
int currentPageItemNo = 0;
while (currentPageItemNo++ < pageSize && page.MoveNext())
{
var idea = page.Current;
Console.WriteLine(idea);
}
took += pageSize;
if (took < count)
{
Console.WriteLine("Next page (y/n)?");
char answer = Console.ReadLine().FirstOrDefault();
getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);
}
}
while (getNextPage && took < count);
}
ব্যাখ্যা: Skip()একাধিকবার "ক্যাসকেডিং পদ্ধতিতে" ব্যবহার করার কুফলটি হ'ল এটি পুনরাবৃত্তির "পয়েন্টার" সংরক্ষণ করবে না, যেখানে এটি সর্বশেষে এড়িয়ে গিয়েছিল। - পরিবর্তে মূল ক্রমটি স্কিপ কলগুলির সাথে সামনের লোডযুক্ত হবে, যা ইতিমধ্যে "গ্রাসিত" পৃষ্ঠাগুলি বারবার "গ্রাস" করতে পরিচালিত করবে। - আপনি প্রমাণ করতে পারেন যে আপনি যখন সিকোয়েন্স তৈরি করেন ideasযাতে এটির পার্শ্ব প্রতিক্রিয়া হয়। -> আপনি যদি 10-20 এবং 20-30 এড়িয়ে গেছেন এবং 40+ প্রসেস করতে চান তবে আপনি 40+ এর পুনরাবৃত্তি শুরু করার আগেই 10-30 এর সমস্ত পার্শ্ব প্রতিক্রিয়াগুলি আবার কার্যকর করা হবে। IEnumerableসরাসরি ইন্টারফেস ব্যবহার করে বৈকল্পিকটি পরিবর্তে শেষ লজিকাল পৃষ্ঠার সমাপ্তির অবস্থানটি মনে রাখে, সুতরাং কোনও স্পষ্টত এড়ানো প্রয়োজন হবে না এবং পার্শ্ব প্রতিক্রিয়াগুলি পুনরাবৃত্তি হবে না।