c# foreach

st_st
Дата: 28.06.2010 09:14:23
Можно ли привязать foreach к hashtable таким образом, чтобы цикл проходил согласно добавленным элементам в hashtable, например начиная с первого добавленного элемента и далее? Таким образом работает foreach в javascript.
Roman S. Golubin
Дата: 28.06.2010 10:21:41
st_st
Можно ли привязать foreach к hashtable таким образом, чтобы цикл проходил согласно добавленным элементам в hashtable, например начиная с первого добавленного элемента и далее? Таким образом работает foreach в javascript.


Что значит "привязать foreach к hashtable"?
Вам надо выбрать данные в определенном порядке или кто на ком стоял?
Яростный Меч
Дата: 28.06.2010 10:36:37
st_st,

придется держать доп. List<T>, в который помещать ссылки на объекты (в конец). Потом по нему проходить.

Если элементов предполагается быть очень много и возможны частые удаления, то лучше подойдет LinkedList<T>
bazaea
Дата: 28.06.2010 10:56:40
st_st
Можно ли привязать foreach к hashtable таким образом, чтобы цикл проходил согласно добавленным элементам в hashtable, например начиная с первого добавленного элемента и далее? Таким образом работает foreach в javascript.


В hashtable элементы расположены не в порядке их добавления, а согласно значениям их хэш функций. В независимости от языка. И про javascript вы что-то напутали.

т.е.

foreach (KeyValuePair p in h)
{
...
}

не будет перебирать элементы по порядку их добавления.
st_st
Дата: 28.06.2010 11:03:11
Javascript:
<script>
	test = new Array();
	test["1"] = "one";
	test["2"] = "two";
	test["3"] = "three";
	test["4"] = "four";
	test["5"] = "five";
	test["6"] = "six";
	for(var key in test) document.write(test[key]+';<br>');
</script>

Результат:
javascript

one;
two;
three;
four;
five;
six;


C#:
            Hashtable tst = new Hashtable();
            tst.Add("1", "one");
            tst.Add("2", "two");
            tst.Add("3", "three");
            tst.Add("4", "four");
            tst.Add("5", "five");
            tst.Add("6", "six");
            foreach (DictionaryEntry x in tst)
            {
                Context.Response.Write(x.Value.ToString() + ";<br>");
            }

Результат:
c#

four;
five;
six;
one;
two;
three;

В случае с c# всё перемешано.

В идеале нужен отсортированный ассоциативный массив. Массив создаётся в отсортированном (order by) виде из sql-запроса. Получается массив массивов, где индекс внешнего массива - ссылка на родитель, индекс внутреннего - id самого элемента. При построении дерева, двумя циклами foreach пробегаюсь по ключам массивов от корня к ветвям, но так как foreach берёт данные с любого места, то и вывод получается неотсортированным.
Если только foreach убрать, использовать for и в отдельном списке/массиве хранить ключи?
Roman S. Golubin
Дата: 28.06.2010 11:21:36
st_st
Массив создаётся в отсортированном (order by) виде из sql-запроса.


Может натолкнет на мысль :)

var mylist = new Dictionary<int, string>()
{
	{1, "one"},
	{2, "two"},
	{3, "three"},
	{4, "four"},
	{5, "five"},			
};

foreach (var d in mylist.OrderBy(x=>x.Key))
	Console.WriteLine(d.Value);
bazaea
Дата: 28.06.2010 11:49:01
st_st
Javascript:
<script>
	test = new Array();
	test["1"] = "one";
	test["2"] = "two";
	test["3"] = "three";
	test["4"] = "four";
	test["5"] = "five";
	test["6"] = "six";
	for(var key in test) document.write(test[key]+';<br>');
</script>

Результат:
javascript

one;
two;
three;
four;
five;
six;


C#:
            Hashtable tst = new Hashtable();
            tst.Add("1", "one");
            tst.Add("2", "two");
            tst.Add("3", "three");
            tst.Add("4", "four");
            tst.Add("5", "five");
            tst.Add("6", "six");
            foreach (DictionaryEntry x in tst)
            {
                Context.Response.Write(x.Value.ToString() + ";<br>");
            }

Результат:
c#

four;
five;
six;
one;
two;
three;

В случае с c# всё перемешано.


В javascript - вы используете массив, в c# hashtable. Разница тут не в языках программирования а в сути самих объектов.

Тут сетую на безграмотность нынешней молодежи

st_st

В идеале нужен отсортированный ассоциативный массив. Массив создаётся в отсортированном (order by) виде из sql-запроса. Получается массив массивов, где индекс внешнего массива - ссылка на родитель, индекс внутреннего - id самого элемента.


Есть SortedDictionary - он хранит в отсортированном по ключу порядке.
Яростный Меч
Дата: 28.06.2010 12:06:50
bazaea
В javascript - вы используете массив, в c# hashtable. Разница тут не в языках программирования а в сути самих объектов.
В javascript hashtable тоже в порядке добавления
var obj = {};
obj['eee'] = 35;
obj['qqq'] = 1;
obj['aaa'] = 34;

for(var key in obj) document.write(obj[key]+';<br>');

выведет 35, 1, 34
bazaea
Дата: 28.06.2010 12:12:53
Яростный Меч
bazaea
В javascript - вы используете массив, в c# hashtable. Разница тут не в языках программирования а в сути самих объектов.
В javascript hashtable тоже в порядке добавления
var obj = {};
obj['eee'] = 35;
obj['qqq'] = 1;
obj['aaa'] = 34;

for(var key in obj) document.write(obj[key]+';<br>');

выведет 35, 1, 34


Это не hashtable по определению.
st_st
Дата: 28.06.2010 14:02:15
bazaea
Есть SortedDictionary - он хранит в отсортированном по ключу порядке.

Нужна сортировка по значению.

Hashtable и StringDictionary, оба выводят в случайном порядке.

Вот это - "var tree = new Dictionary<string, object>();" подходит, в каком порядке данные занесены, в таком и выводит, на стадии тестирования пока работает как надо.