Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ, GroupBy / 3 сообщений из 3, страница 1 из 1
07.03.2009, 13:11
    #35857056
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ, GroupBy
Джозеф Раттц. Мл.
Все прототипы операции 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
07.03.2009, 13:51
    #35857069
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ, GroupBy
Вопрос снят. Решил задачу таким образом:
Код: 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
09.03.2009, 13:39
    #35858177
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ, GroupBy
если тебе необязательно сравнивать по двум полям, а можно только по одному (судя из исходного примера), то реализуется без дополнительного класса:
Код: 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ, GroupBy / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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