Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 06:24
Оценка: :))
Всем хороша конструкция foreach (.net).
Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
Поэтому приходится вводить индексную переменную и инкрементировать ее:


int i = 0;
foreach (object o in collection)
{

//any

i++;
}


Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.
Тогда код превратится

foreach (object o in collection)
{
//any with o.Index
}
Re: Нововведение в foreach
От: AlexGin Беларусь  
Дата: 14.09.10 06:35
Оценка: +2 -2
Здравствуйте, 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
_>}
_>


А чем же не подходит старый-добрый for

for (int iIndex = 0; iIndex < collection.Count; iIndex++)
{
object o = collection[iIndex];
}
Re: Нововведение в foreach
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 14.09.10 06:40
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.

_>Тогда код превратится

_>
_>foreach (object o in collection)
_>{
_>//any with o.Index
_>}
_>


Можно как в lua сделать возможность добавления индекса (i — индекс, v — значение):
for i, v in pairs(collection)
do

end
Re: Нововведение в foreach
От: FR  
Дата: 14.09.10 06:40
Оценка:
Здравствуйте, barn_czn, Вы писали:


_>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.

_>Тогда код превратится

Удобней просто позволять объявлять индексную переменную, например как в D

import std.stdio;

void main()
{
    string a = "Test";

    foreach (int i, char c; a)
    {
        writeln(i, "  : ", c);
    }
    
    foreach (char c; a)
    {
        writeln(c);
    }
}


http://www.digitalmars.com/d/2.0/statement.html#ForeachStatement
Re[2]: Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 06:41
Оценка:
Здравствуйте, 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. Опять таки с индексной переменной. Но это еще хуже.
Re: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 06:53
Оценка:
Здравствуйте, barn_czn, Вы писали:


_>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.

_>Тогда код превратится

Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?
С уважением, Анатолий Попов.
ICQ: 995-908
Re: Нововведение в foreach
От: minorlogic Украина  
Дата: 14.09.10 06:56
Оценка: 1 (1) -1 :)
Здравствуйте, barn_czn, Вы писали:
...
_>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
...

Скорее всего тут foreach используется неуместно.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[2]: Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 06:57
Оценка: -1
Здравствуйте, Aen Sidhe, Вы писали:

AS>Здравствуйте, barn_czn, Вы писали:



_>>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.

_>>Тогда код превратится

AS>Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?


Читаем внимательно заголовок — Нововведение в _foreach_.
Поэтому речь идет о коллекциях в контексте _foreach_, и если IEnumerable ведет себя каждый раз по разному — то это его проблема, введение индексной переменной все равно этого не решит. Я лиш предложил расширение синтаксиса foreach ради сокращения кол-ва кода.
Re: Нововведение в foreach
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 14.09.10 06:58
Оценка: +1
Здравствуйте, barn_czn, Вы писали:


_>Всем хороша конструкция 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 );  
    }
}


Как использовать думаю разберешься.
Re[2]: Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 07:02
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Здравствуйте, barn_czn, Вы писали:

M>...
_>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
M>...

M>Скорее всего тут foreach используется неуместно.


Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент.
И как вы это сделаете с IEnumerable?

В MS SQL например до недавних пор пейджинг было трудно сделать по той же причине — там не было выражения ROW_NUMBER.
Re[3]: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 07:05
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Здравствуйте, Aen Sidhe, Вы писали:


AS>>Здравствуйте, barn_czn, Вы писали:



_>>>Собственно предлагаю нововведение: в теле foreach сделать доступной пропертю Index.

_>>>Тогда код превратится

AS>>Как быть с коллекциями, к которым понятие "индекс" не применимо? Как быть с коллекциями, которые не гарантируют порядок членов? В конце концов, как быть с бесконечными последовательностями?


_>Читаем внимательно заголовок — Нововведение в _foreach_.


Читал вообще-то.

_>Поэтому речь идет о коллекциях в контексте _foreach_, и если IEnumerable ведет себя каждый раз по разному — то это его проблема, введение индексной переменной все равно этого не решит. Я лиш предложил расширение синтаксиса foreach ради сокращения кол-ва кода.


У меня нет индексных переменных в foreach, а foreach много. Может я что не так делаю?
Я выше привёл несколько примеров, где оно будет совершенно лишним.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[3]: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 07:06
Оценка: +2 :)
Здравствуйте, barn_czn, Вы писали:

_>Здравствуйте, minorlogic, Вы писали:


M>>Здравствуйте, barn_czn, Вы писали:

M>>...
_>>>Но часто надо при пробегании по коллекции обращатся к индексу объекта в коллекции.
M>>...

M>>Скорее всего тут foreach используется неуместно.


_>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент.

_>И как вы это сделаете с IEnumerable?

[c#]
foreach (var i in collection.Skip(5).Take(10))
...
[c#]
С уважением, Анатолий Попов.
ICQ: 995-908
Re[4]: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 07:07
Оценка:
Здравствуйте, 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#]
С уважением, Анатолий Попов.
ICQ: 995-908
Re[3]: Нововведение в foreach
От: LF  
Дата: 14.09.10 07:08
Оценка:
_>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент.
_>И как вы это сделаете с IEnumerable?

list.Skip(5).Take(5)
Re[2]: Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 07:10
Оценка:
Здравствуйте, 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 не работает). Если не ошибаюсь.
Re[4]: Нововведение в foreach
От: barn_czn  
Дата: 14.09.10 07:12
Оценка:
Здравствуйте, 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). Я конечно вкурсе этого метода.
Re[5]: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 07:13
Оценка: +3
Здравствуйте, barn_czn, Вы писали:

_>>>Это почему? Вам надо например пробежатся по коллекции и выбрать с 5го по 10й элемент.

_>>>И как вы это сделаете с IEnumerable?

AS>>[c#]

AS>>foreach (var i in collection.Skip(5).Take(10))
AS>> ...
AS>>[c#]

_>Э ребят так не честно, я предлагаю фичу на уровне языка, а вы мне решение с применением либы (LINQ). Я конечно вкурсе этого метода.


Не надо каждую левую пятку в язык тащить.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[5]: Нововведение в foreach
От: LF  
Дата: 14.09.10 07:13
Оценка:
_>Э ребят так не честно, я предлагаю фичу на уровне языка, а вы мне решение с применением либы (LINQ). Я конечно вкурсе этого метода.
Если либа дает решение, зачем что то решать на уровне языка?
Re: Нововведение в foreach
От: Sinix  
Дата: 14.09.10 07:14
Оценка: 16 (4) +2
Здравствуйте, barn_czn, Вы писали:

foreach (var o in collection.Select((item,index)=>new {item, index}))
{
  o.index;
}

?

Читаем
http://blogs.msdn.com/b/ruericlippert/archive/2009/05/21/9692983.aspx
-и по ссылке-
http://blogs.msdn.com/b/ericlippert/archive/2003/10/28/53298.aspx
Re[3]: Нововведение в foreach
От: Aen Sidhe Россия Просто блог
Дата: 14.09.10 07:17
Оценка:
Здравствуйте, 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();
        }
С уважением, Анатолий Попов.
ICQ: 995-908
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.