Здравствуйте, _FRED_, Вы писали:
L>>У тебя возникли какие-то вопросы после просмотра исходников List.Add и List.Enumerator.MoveNext?
_FR>Нет, но
_FR>Если честь-по-чести, то я говорил совсем о другом… После твоих объяснений данный вопрос меня более не интересует. Хочется сделать так
Предложи свой вариант, замену foreach-у. Очень интересно посмотреть.
_FR>З.Ы. Просто я не умею спорить с теми, кто не замечает мои вопросы и не отвечает на них.
Здравствуйте, Константин Л., Вы писали:
КЛ>это как стандарт с++ и реализация STL КЛ>Если на FCL есть стандарт ( ), и там ничего не указано про порядок — то порядок — implementation defined. Что значит, что на него не стоит полагаться.
FCL — не стандарт. Его описание — хелп по готовой системе.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Константин Л., Вы писали:
КЛ>>это как стандарт с++ и реализация STL КЛ>>Если на FCL есть стандарт ( ), и там ничего не указано про порядок — то порядок — implementation defined. Что значит, что на него не стоит полагаться. GZ>FCL — не стандарт. Его описание — хелп по готовой системе.
Здравствуйте, _FRED_, Вы писали:
_FR>З.Ы. Просто я не умею спорить с теми, кто не замечает мои вопросы и не отвечает на них. Лучше я умру, чем буду пытаться переубедить их в чём-то.
Здравствуйте, vadi, Вы писали:
V>Так вот перебор идет не в том порядке в каком элементы были добавлены в List.
1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase.
2. Никаких требований на взаимоотношения методов Add() и GetEnumerator() стандарт не налагает
3. В частности, перебор Dictionary будет происходить вовсе не в том порядке, в котором добавляли.
V>Почему?? и что делать???
Исправлять ошибку в TClass, из-зв которой кажется, что экземаляры идут не в том порядке. Или приводить настоящий код, а не "по мотивам".
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Константин Л., Вы писали:
КЛ>>>это как стандарт с++ и реализация STL КЛ>>>Если на FCL есть стандарт ( ), и там ничего не указано про порядок — то порядок — implementation defined. Что значит, что на него не стоит полагаться. GZ>>FCL — не стандарт. Его описание — хелп по готовой системе. КЛ>я разве это говорил?
Нет. Но из этого следует что любой пример найденный в хелп может быть интерпретирован как стандарт, или просто считать утвержение верным если оно всегда выполняется. И соответсвенно в следующей версии может быть изменен не только порядок обхода, но и само наличие List<> — если утверждение о том что данная функциональность останется не получено из официального источника. И у меня есть такая мысль, что и List<> в след. версиях будет, и порядок обхода будет совпадать с индексированным обходом.
Здравствуйте, GlebZ, Вы писали:
GZ>И у меня есть такая мысль, что и List<> в след. версиях будет, и порядок обхода будет совпадать с индексированным обходом.
Господа, не могу найти в документации того факта, что индексированный обход возвращает элементы в том порядке, в каком они были добавлены.
Я серьезно встревожен!
Здравствуйте, Sinclair, Вы писали:
V>>Так вот перебор идет не в том порядке в каком элементы были добавлены в List. S>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase.
Ага, щаззз. Вот пример, опровергающий это определение:
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
static void Main() {
List<int> items = new List<int>();
items.Add(3);
items.Add(2);
items.Add(1);
items.Sort();
for(int i = 0; i < items.Count; i++) {
Debug.Print("items[{0}] = {1}", i, items[i]);
}//for
}
}
S>3. В частности, перебор Dictionary будет происходить вовсе не в том порядке, в котором добавляли.
Ага, щаззз. Вот пример, опровергающий это определение:
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
static void Main() {
Dictionary<string, int> items = new Dictionary<string, int>();
items.Add("A", 1);
items.Add("B", 2);
items.Add("C", 3);
foreach(KeyValuePair<string, int> item in items) {
Debug.WriteLine(item);
}//for
}
}
Что ж это за формулировки такие "детские", что они рушатся при ближайшем же рассмотрении?
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, nikov, Вы писали:
GZ>>И у меня есть такая мысль, что и List<> в след. версиях будет, и порядок обхода будет совпадать с индексированным обходом.
N>Господа, не могу найти в документации того факта, что индексированный обход возвращает элементы в том порядке, в каком они были добавлены. N>Я серьезно встревожен!
Я тебя огорчу с удовольствием: индексированный обход класса List<> может возвращать элементы не в том порядке, в котором они были добавлены :о)) Подтверждаю примером:
using System;
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
static void Main() {
List<int> items = new List<int>();
items.Add(3);
items.Add(2);
items.Add(1);
items.Sort();
for(int i = 0; i < items.Count; i++) {
Debug.Print("items[{0}] = {1}", i, items[i]);
}//for
}
}
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, vadi, Вы писали:
V>>Так вот перебор идет не в том порядке в каком элементы были добавлены в List. S>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase. S>2. Никаких требований на взаимоотношения методов Add() и GetEnumerator() стандарт не налагает S>3. В частности, перебор Dictionary будет происходить вовсе не в том порядке, в котором добавляли.
V>>Почему?? и что делать??? S>Исправлять ошибку в TClass, из-зв которой кажется, что экземаляры идут не в том порядке. Или приводить настоящий код, а не "по мотивам".
Я тут выяснил что foreach вытаскивает по индексу, а вот ADD у листа не понятно как этот индекс вставляет. Т.е не факт того что подряд метод ADD даст и подрят этот индекс..
Здравствуйте, rameel, Вы писали:
R>Так не честно, я так не играю
И где же это запрещено
Дело в том, что, как я понимаю, многие просто тут не видят разницы между порядком добавления и порядком хранения элементов, что я и продемонстрировал.
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Sinclair, Вы писали:
V>>Так вот перебор идет не в том порядке в каком элементы были добавлены в List. S>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase.
Что ты понимаешь под "стандартных"? Определённых в mscorlib?
... << RSDN@Home 1.2.0 alpha rev. 670>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, vadi, Вы писали:
V>Я тут выяснил что foreach вытаскивает по индексу, а вот ADD у листа не понятно как этот индекс вставляет. Т.е не факт того что подряд метод ADD даст и подрят этот индекс..
Это факт. При добавлении (Add) элемента он добавляется в конец List-а.
Здравствуйте, vadi, Вы писали:
V>Я тут выяснил что foreach вытаскивает по индексу, а вот ADD у листа не понятно как этот индекс вставляет. Т.е не факт того что подряд метод ADD даст и подрят этот индекс..
Я конечно сильно извиняюсь, но толи я не понял, толь вы воду в ступе колотите (ну или колотаете)
foreach как сказали умные люди выше пользует IEnumerable и IEnumerator, так что в каком порядке IEnumerator пройдет по колекции, в таком порядке эти элементы в foreach и появятся
List<int> ls = new List<int>();
ls.Add(1);
ls.Add(2);
ls.Add(3);
foreach (int item in ls)
Console.WriteLine(item);
// Тоже что и
IEnumerator ls_Enumerator = ls.GetEnumerator();
while(ls_Enumerator.MoveNext())
Console.WriteLine(ls_Enumerator.Current);
// Тоже что и
IEnumerator<int> ls_int_Enumerator = ls.GetEnumerator();
while(ls_int_Enumerator.MoveNext())
Console.WriteLine(ls_int_Enumerator.Current);
А метод Add у List добавляет элемент в конец списка тоесть Insert(item,this.count)
.NET Framework Class Library
List.Add Method
Adds an object to the end of the List.
Здравствуйте, _FRED_, Вы писали: S>>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase. _FR>Что ты понимаешь под "стандартных"? Определённых в mscorlib?
Рекомендую перечитать мой пост еще раз.
1.2.0 alpha rev. 655
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Предерживаюсь же я следующей точки зрения:
При обходе набора элементов что надо знать? Индекс текущего элемента от начала? Тогда
int index = 0;
foreach(object item in container) {
// …
index++;
}//for
Или позиция элемента в контейнере? В таком случае (если контейнер, конечно же позволяет):
foreach(object item in container) {
int index = container.IndexOf(item);
// …
}//for
или же, если опять контейнер позволяет, использовать цикл for вместо foreach.
Теперь что касается добавления: какое вообще значение имеет порядок добавления элементов? Только то, что подразумевает под добавлением контейнер. И не один контейнер _не обязан_ при перечислении возвращать элементы в той же последовательности, в которой они были в него добавлены, например потому, что между добавлением и перечислением можно над контейнером "потворить чудеса".
Зачастую, енумератор по-умолчанию контейнера возвращает элементы в порядке, так сказать, хранения. Это видно хотя бы из кода, которые не сочёл за труд показать Lloydздесь
Здравствуйте, Sinclair, Вы писали:
S>>>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase. _FR>>Что ты понимаешь под "стандартных"? Определённых в mscorlib? S>Рекомендую перечитать мой пост еще раз.
Перечита. И опять удивился
S>1. Для всех стандартных коллекций енумератор возвращает в порядке добавления. Имеются в виду Array, List<>, ArrayList, CollectionBase.
Это _все_ стандартные коллекции? А как же Stack — это уже не стандартная коллекция? или не коллекция? Что я тогда должен подумать о ней, читая и веря твоему посту? Что я "страдаю фигнёй"? Ага.
А что касается CollectionBase, так в наследнике её я могу переехать OnInsert и изменять индек по своему усмотрению. Так что её место в твоём списке мне вообще не понятно.