powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ, GroupBy
3 сообщений из 3, страница 1 из 1
LINQ, GroupBy
    #35857056
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джозеф Раттц. Мл.
Все прототипы операции GroupBy возвращают последовательность IGrouping<K,T>:
Код: plaintext
1.
2.
IGrouping<K,T>:IEnumerable<T>
{K Key {get;}}

Мне нужно, чтобы GroupBy группировал по указанному мною полю (Key), а на выходе выдал экземпляр класса T.
Код:
Код: plaintext
1.
2.
3.
4.
5.
var tree = ds.Tables["Activity"].AsEnumerable().Join(ds.Tables["ActivityOfCompany"].AsEnumerable(),
m => m[0], n => n[1], (m, n) => new TreeNode {Text = ((string)m[1]).Trim(), Tag = m[0]})
.GroupBy(m => (int) m.Tag)
.OrderBy(n => n.Key); //Мне бы хотелось, чтобы на выходе был объект TreeNode, для которого 
//я бы сделал группировку:  .OrderBy(n => n.Text), а var заменил бы на IEnumerable<TreeNode>.
Как правильней решить данную проблему?

_____________________________________________________________________________________________________
... а хуже всего приходится программистам из Microsoft: им, бедолагам, в случае чего и обругать-то некого...
...
Рейтинг: 0 / 0
LINQ, GroupBy
    #35857069
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снят. Решил задачу таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
...
IEnumerable<TreeNode> tree = ds.Tables["Activity"].AsEnumerable().Join(ds.Tables["ActivityOfCompany"].AsEnumerable(),
m => m[0], n => n[1], (m, n) => new TreeNode { Text = ((string)m[1]).Trim(), Tag = m[0] })
.GroupBy(m =>m, new MyComparer()).Select(k =>k.Key).OrderBy(n => n.Text);  
...
        class MyComparer :IEqualityComparer<TreeNode>
        {
            #region IEqualityComparer<TreeNode> Members

            public bool Equals(TreeNode x, TreeNode y)
            {
                if (x.Text == y.Text && (int)x.Tag == (int)y.Tag)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            public int GetHashCode(TreeNode obj)
            {
                if (obj.Tag.GetType() != typeof(int))
                {
                    throw new Exception("Свойство Tag должно содержать объект типа int");
                }
                return obj.Text.GetHashCode();
            }
            #endregion
        }

___________________________________________________________
... а хуже всего приходится программистам из Microsoft:
Им, бедолагам, в случае чего и обругать-то некого...
...
Рейтинг: 0 / 0
LINQ, GroupBy
    #35858177
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если тебе необязательно сравнивать по двум полям, а можно только по одному (судя из исходного примера), то реализуется без дополнительного класса:
Код: plaintext
1.
2.
3.
4.
5.
var list = new[] { 1, 2, 1, 3, 2, 4 };
var res = list.Select(p => new System.Windows.Forms.TreeNode() { Text = p.ToString(), Tag = p })
	.GroupBy(p => p.Tag)
	.Select(p => p.First())
	.OrderBy(p => p.Text);
			

если нужно все-таки по двум, то поправь метод GetHashCode - нужно возвращать либо комбинированный хэш Text+Tag (поскольку сравниваешь ты сразу по двум полям), либо используй релизацию класса TreeNode (если такая есть, думаю, есть).
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ, GroupBy
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]