Всем хороша конструкция foreach (.net).
Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
Поэтому приходится вводить индексную переменную и инкрементировать ее:
int i = 0;
foreach (object o in collection)
{
//any
i++;
}
Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.
Тогда код превратится
foreach (object o in collection)
{
//any with o.Index
}
_>Всем хороша конструкция foreach (.net). _>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. _>Поэтому приходится вводить индексную переменную и инкрементировать ее:
_>
_>int i = 0;
_>foreach (object o in collection)
_>{
_>//any
_>i++;
_>}
_>
_>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index. _>Тогда код превратится
_>
_>foreach (object o in collection)
_>{
_>//any with o.Index
_>}
_>
А чем же не подходит старый-добрый for
for (int iIndex = 0; iIndex < collection.Count; iIndex++)
{
object o = collection[iIndex];
}
Здравствуйте, AlexGin, Вы писали:
AG>Здравствуйте, barn_czn, Вы писали:
_>>Всем хороша конструкция foreach (.net). _>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. _>>Поэтому приходится вводить индексную переменную и инкрементировать ее:
_>>
_>>int i = 0;
_>>foreach (object o in collection)
_>>{
_>>//any
_>>i++;
_>>}
_>>
_>>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index. _>>Тогда код превратится
_>>
_>>foreach (object o in collection)
_>>{
_>>//any with o.Index
_>>}
_>>
AG>А чем же не подходит старый-добрый for
AG>for (int iIndex = 0; iIndex < collection.Count; iIndex++) AG>{ AG> object o = collection[iIndex]; AG>}
Не хочу пускатся в дискуссию чем foreach лучше for, если вы про это.
А индексация collection[iIndex] например в принципе невозможна для IEnumerable (не путайте с IList).
Поэтому for вы не сможете применить для произвольного IEnumerable. Другой путь — получить IEnumerator и пройтись waile. Опять таки с индексной переменной. Но это еще хуже.
_>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index. _>Тогда код превратится
Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?
Здравствуйте, Aen Sidhe, Вы писали:
AS>Здравствуйте, barn_czn, Вы писали:
_>>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index. _>>Тогда код превратится
AS>Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?
Читаем внимательно заголовок — Нововведение в _foreach_.
Поэтому речь идет о коллекциях в контексте _foreach_, и если IEnumerable ведет себя каждый раз по разному — то это его проблема, введение индексной переменной все равно этого не решит. Я лиш предложил расширение синтаксиса foreach ради сокращения кол-ва кода.
_>Всем хороша конструкция foreach (.net). _>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
Я думаю не так часто чтобы это стоило таких изменений в языке.
public static class Extensions
{
public sealed class Indexed<T>
{
private Indexed(T item, int index)
{
this.Item = item;
this.Index = index;
}
public T Item { get; private set; }
public int Index { get; private set; }
}
public static IEnumerable<Indexed<T>> Indexed<T>(this IEnumerable<T> seq)
{
return seq.Select( (v,i) => new Indexed<T>(v,i) );
}
public static IEnumerable<T> RemoveIndex<T>(this IEnumerable<Indexed<T>> seq)
{
return seq.Select( x => x.Item );
}
}
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, barn_czn, Вы писали: M>... _>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. M>...
M>Скорее всего тут foreach используется неуместно.
Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент.
И как вы это сделаете с IEnumerable?
В MS SQL например до недавних пор пейджинг было трудно сделать по той же причине — там не было выражения ROW_NUMBER.
Здравствуйте, barn_czn, Вы писали:
_>Здравствуйте, Aen Sidhe, Вы писали:
AS>>Здравствуйте, barn_czn, Вы писали:
_>>>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index. _>>>Тогда код превратится
AS>>Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?
_>Читаем внимательно заголовок — Нововведение в _foreach_.
Читал вообще-то.
_>Поэтому речь идет о коллекциях в контексте _foreach_, и если IEnumerable ведет себя каждый раз по разному — то это его проблема, введение индексной переменной все равно этого не решит. Я лиш предложил расширение синтаксиса foreach ради сокращения кол-ва кода.
У меня нет индексных переменных в foreach, а foreach много. Может я что не так делаю?
Я выше привёл несколько примеров, где оно будет совершенно лишним.
Здравствуйте, barn_czn, Вы писали:
_>Здравствуйте, minorlogic, Вы писали:
M>>Здравствуйте, barn_czn, Вы писали: M>>... _>>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. M>>...
M>>Скорее всего тут foreach используется неуместно.
_>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент. _>И как вы это сделаете с IEnumerable?
[c#]
foreach (var i in collection.Skip(5).Take(10))
...
[c#]
Здравствуйте, Aen Sidhe, Вы писали:
AS>Здравствуйте, barn_czn, Вы писали:
_>>Здравствуйте, minorlogic, Вы писали:
M>>>Здравствуйте, barn_czn, Вы писали: M>>>... _>>>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. M>>>...
M>>>Скорее всего тут foreach используется неуместно.
_>>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент. _>>И как вы это сделаете с IEnumerable?
AS>[c#] AS>foreach (var i in collection.Skip(5).Take(6)) // конечно же, да не суть. AS> ... AS>[c#]
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, barn_czn, Вы писали:
_>>Всем хороша конструкция foreach (.net). _>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. G>Я думаю не так часто чтобы это стоило таких изменений в языке.
G>
G>public static class Extensions
G>{
G> public sealed class Indexed<T>
G> {
G> private Indexed(T item, int index)
G> {
G> this.Item = item;
G> this.Index = index;
G> }
G> public T Item { get; private set; }
G> public int Index { get; private set; }
G> }
G> public static IEnumerable<Indexed<T>> Indexed<T>(this IEnumerable<T> seq)
G> {
G> return seq.Select( (v,i) => new Indexed<T>(v,i) );
G> }
G> public static IEnumerable<T> RemoveIndex<T>(this IEnumerable<Indexed<T>> seq)
G> {
G> return seq.Select( x => x.Item );
G> }
G>}
G>
G>Как использовать думаю разберешься.
Спасибо не надо, я лучше переменную буду создавать )
К тому же ваша отвертка работает только на IEnumerable<>, просто IEnumerable не прокатит (LINQ не работает). Если не ошибаюсь.
Здравствуйте, Aen Sidhe, Вы писали:
AS>Здравствуйте, barn_czn, Вы писали:
_>>Здравствуйте, minorlogic, Вы писали:
M>>>Здравствуйте, barn_czn, Вы писали: M>>>... _>>>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции. M>>>...
M>>>Скорее всего тут foreach используется неуместно.
_>>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент. _>>И как вы это сделаете с IEnumerable?
AS>[c#] AS>foreach (var i in collection.Skip(5).Take(10)) AS> ... AS>[c#]
Э ребят так не честно, я предлагаю фичу на уровне языка, а вы мне решение с применением либы (LINQ). Я конечно вкурсе этого метода.
Здравствуйте, barn_czn, Вы писали:
_>>>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент. _>>>И как вы это сделаете с IEnumerable?
AS>>[c#] AS>>foreach (var i in collection.Skip(5).Take(10)) AS>> ... AS>>[c#]
_>Э ребят так не честно, я предлагаю фичу на уровне языка, а вы мне решение с применением либы (LINQ). Я конечно вкурсе этого метода.
_>Э ребят так не честно, я предлагаю фичу на уровне языка, а вы мне решение с применением либы (LINQ). Я конечно вкурсе этого метода.
Если либа дает решение, зачем что то решать на уровне языка?
Здравствуйте, barn_czn, Вы писали:
_>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, barn_czn, Вы писали:
G>>Как использовать думаю разберешься.
_>Спасибо не надо, я лучше переменную буду создавать )
Угу. Лучше копипастить везде переменную и код, который её меняет и следит за нет.
_>К тому же ваша отвертка работает только на IEnumerable<>, просто IEnumerable не прокатит (LINQ не работает). Если не ошибаюсь.
Всё работает.
static void Main(string[] args)
{
var c = (IEnumerable) new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (var i in c.Cast<object>().Skip(5).Take(5))
Console.WriteLine(i);
Console.ReadKey();
}