Ответ 1
просто перебираем верхнюю часть из коллекции:
foreach(var rssItem in rss.Channel.Items.Take(6))
У меня есть следующий код
foreach (var rssItem in rss.Channel.Items)
{
// ...
}
Но нужно только 6 элементов не всех элементов, как я могу сделать это на С#?
просто перебираем верхнюю часть из коллекции:
foreach(var rssItem in rss.Channel.Items.Take(6))
Не слишком очевидно, но...
int max = Math.Min(6, rss.Channel.Items.Count);
for (int i = 0; i < max; i++)
{
var rssItem = rss.Channel.Items[i];
//...
}
Я знаю, что это старая школа, и не наполнен всякой добротой метода расширения, но иногда старая школа все еще работает... особенно если вы все еще используете .NET 2.0.
Используйте Enumerable.Take
:
foreach(var rssItem in rss.Channel.Items.Take(6)) {
// go time!
}
Обратите внимание, что
rss.Channel.Items.Take(6)
ничего не делает, кроме создания экземпляра IEnumerable
, который может быть повторен для создания первых шести элементов в перечислении. Это функция отложенного выполнения LINQ to Objects.
Обратите внимание, что это предполагает .NET 3.5. Если вы работаете с более ранней версией .NET, вы можете использовать что-то в следующих строках:
static IEnumerable<T> Take<T>(IEnumerable<T> source, int take) {
if (source == null) {
throw new ArgumentNullException("source");
}
if (take < 0) {
throw new ArgumentOutOfRangeException("take");
}
if (take == 0) {
yield break;
}
int count = 0;
foreach (T item in source) {
count++;
yield return item;
if (count >= take) {
yield break;
}
}
}
Тогда:
foreach(var rssItem in Take(rss.Channel.Items, 6)) {
// go time!
}
Это предполагает .NET 2.0. Если вы не используете .NET 2.0, вам следует серьезно подумать об обновлении.
Если вас интересует условие (т.е. упорядочение по дате, созданной)
foreach(var rssItem in rss.Channel.Items.OrderByDescending(x=>x.CreateDate).Take(6))
{
//do something
}
Возможно, если вы хотите получить те, которые были созданы определенным пользователем, с тем же самым типом
foreach(var rssItem in rss.Channel.Items
.Where(x=>x.UserID == 1)
.OrderByDescending(x=>x.CreateDate)
.Take(6))
{
//do something
}
Вы также можете просто выйти из цикла, если вы не хотите использовать linq.
int count = 0;
foreach (var rssItem in rss.Channel.Items)
{
if (++count == 6) break;
...
}
rss.Channel.Items.Take(6)