powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ. Подсчет уникальных значений с группировкой DataTable
6 сообщений из 6, страница 1 из 1
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36901827
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Есть некая DataTable Result в которой находятся результаты тестов.

Сильно упрощенно это выглядит так:

Result
(

GroupName string
PupilName string
Date datetime
Mark int
)

Данные примерно такие (дата и оценка сейчас не важны, важно что они разные)

GroupName PupilName Date Mark1A51A31A41Б21Б51Б52В42В22В5

Мне нужно подсчитать сколько человек в группе тестировались.

То есть получить

GroupName PupilCount1221

Пишу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var query1 =
                from res in Result.Distinct()
                orderby res.GroupName
                group res by new { GroupName = res.Field<string>("GroupName") } into g

                select new
                {
                    PupilCount = g.Count(),
                    groupName = g.Key


                };

и получаю

GroupName PupilCount1623

Оно и понятно. Все строки разные и подсчиитано количество строк в группе

Начинаю разбираться.

Оказывается надо не просто Distinct(), a Distinct( Comparer)


Пишу свой компарер, что бы сравнение на уникальность шло только по полю GroupName.

Distinct( new MyComparer() )
и получаю

Ошибка 1 Аргументы-типы для метода "System.Linq.Enumerable.Distinct<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Collections.Generic.IEqualityComparer<TSource>)" не должны определяться по использованию. Попытайтесь явно определить аргументы-типы.

И тут я ничего не понял. Что жк мне надо написать аргументом в Distinct() ?

Я выкрутился со вспомогательным запросом, который оставил только две колонки но это как-то неаккуратненько.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            var query0 =
                from res in results.AsEnumerable()
                select new
                {
                    PupilName = res.Field<string>(PupilName),
                    GroupName = res.Field<string>(GroupName),

                };


            var query1 =
                from res in query0.Distinct()
                orderby res.GroupName
                group res by res.GroupName into g

                select new
                {
                    PupilCount = g.Count(),
                    groupName = g.Key

                };


============
Я знаю как это можно сделать прямым запросом к базе. Но по религиозным соображениям мне надо LINQ к DataTable
...
Рейтинг: 0 / 0
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36902007
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Result> resultList = new List<Result>();
        resultList.Add(new Result("1", "А", DateTime.Now, 5));
        resultList.Add(new Result("1", "А", DateTime.Now, 3));
        resultList.Add(new Result("1", "А", DateTime.Now, 4));
        resultList.Add(new Result("1", "Б", DateTime.Now, 2));
        resultList.Add(new Result("1", "Б", DateTime.Now, 5));
        resultList.Add(new Result("1", "Б", DateTime.Now, 5));
        resultList.Add(new Result("2", "В", DateTime.Now, 4));
        resultList.Add(new Result("2", "В", DateTime.Now, 2));
        resultList.Add(new Result("2", "В", DateTime.Now, 5));

        var query1 = resultList.GroupBy(r => r.GroupName).Select(g => new { groupName = g.Key, PupilCount = g.Distinct(new MyComparer()).Count() });

        GridView1.DataSource = query1.ToList();
        DataBind();
    }
}

public class Result
{
    public string GroupName {get; set;}
    public string PeopleName {get; set;}
    public DateTime Date { get; set; }
    public int Mark { get; set; }

    public Result()
    {
    }
    public Result(string groupName, string peopleName, DateTime date, int mark)
    {
        this.GroupName = groupName;
        this.PeopleName = peopleName;
        this.Date = date;
        this.Mark = mark;
    }

}

public class MyComparer : IEqualityComparer<Result>
{
    public bool Equals(Result x, Result y)
    {
        return x.PeopleName == y.PeopleName;
    }

    public int GetHashCode(Result obj)
    {
        return obj.PeopleName.GetHashCode();
    }
}

...
Рейтинг: 0 / 0
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36902012
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36902109
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
bured,

Спасибо. В понедельник попробую сделать по такому способу
...
Рейтинг: 0 / 0
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36902120
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя же DataTable, сразу не заметил.
Тогда так:
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable result = new DataTable();
        result.Columns.Add("GroupName", typeof(string));
        result.Columns.Add("PeopleName", typeof(string));
        result.Columns.Add("Date", typeof(DateTime));
        result.Columns.Add("Mark", typeof(int));

        result.Rows.Add(new object[]{"1", "А", DateTime.Now, 5});
        result.Rows.Add(new object[]{"1", "А", DateTime.Now, 3});
        result.Rows.Add(new object[]{"1", "А", DateTime.Now, 4});
        result.Rows.Add(new object[]{"1", "Б", DateTime.Now, 2});
        result.Rows.Add(new object[]{"1", "Б", DateTime.Now, 5});
        result.Rows.Add(new object[]{"1", "Б", DateTime.Now, 5});
        result.Rows.Add(new object[]{"2", "В", DateTime.Now, 4});
        result.Rows.Add(new object[]{"2", "В", DateTime.Now, 2});
        result.Rows.Add(new object[]{"2", "В", DateTime.Now, 5});

        var query1 = result.Rows.Cast<DataRow>().GroupBy(r => r.Field<string>("GroupName")).Select(g => new { groupName = g.Key, PeopleCount = g.Distinct(new MyComparer()).Count() });

        GridView1.DataSource = query1.ToList();
        DataBind();
    }
}


public class MyComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow x, DataRow y)
    {
        return x.Field<string>("PeopleName") == y.Field<string>("PeopleName");
    }

    public int GetHashCode(DataRow obj)
    {
        return obj.ToString().GetHashCode();
    }
}

...
Рейтинг: 0 / 0
LINQ. Подсчет уникальных значений с группировкой DataTable
    #36904531
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Еще раз спасибо, все сработало

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 var query1 =
                from res in results.AsEnumerable().Distinct(new GroupDataRowComparer())
                orderby res.Field<string>("GroupName")
                group res by res.Field<string>("GroupName") into g
                select new
                {
                    PupilCount = g.Count(),
                    groupName = g.Key,

                };

Однако ошибка у меня была не тут

Неправильно написал компарер

Не указал, что
Код: plaintext
class GroupDataRowComparer 
является потомком
Код: plaintext
: IEqualityComparer<DataRow>

Написал

Код: plaintext
1.
2.
3.
4.
    class GroupDataRowComparer
{
        ...
}
а надо было
Код: plaintext
1.
2.
3.
4.
    class GroupDataRowComparer : IEqualityComparer<DataRow>
{
        ...
}
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ. Подсчет уникальных значений с группировкой DataTable
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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