DataTable: динамическое группирование по выражению по LINQ или LAMBDA - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть DataTable, в котором я хочу сгруппировать по неопределенному количеству полей.Это происходит потому, что пользователь может выбирать поля, по которым он хочет сгруппировать.

Так что, на самом деле, я нажимаю на выбор в списке.И в этом случае я должен сгруппировать свой DataTable.

Представьте себе этот фрагмент кода (VB или C # - то же самое):

public void groupFieldsFN(DataTable dt, List<string> groupFields){

    var grpQuery = dt.AsEnumerable().GroupBy(r => [***groupFields***]);
}

Что я могу сделать?Как я могу выразить выражение GroupBy в этом контексте.

Понятно, что решение LINQ или LAMBDA одинаково.

Заранее спасибо за помощь.

_

РЕШЕНИЕ

Ответ Алексея Андреева работает!Большое спасибо.

1 Ответ

2 голосов
/ 03 апреля 2019

Вы можете использовать пользовательский компаратор равенства в вызове GroupBy.Определите ваш компаратор:

public class CustomEqualityComparer : IEqualityComparer<DataRow>
{
    private readonly List<string> groupFields;

    public CustomEqualityComparer(List<string> groupFields)
    {
        this.groupFields = groupFields;
    }

    public bool Equals(DataRow x, DataRow y)
    {
        var xCols = groupFields.Select(f => x[f]);
        var yCols = groupFields.Select(f => y[f]);
        var pairs = xCols.Zip(yCols, (v1, v2) => (v1, v2));
        return pairs.All(p => p.Item1.Equals(p.Item2));
    }

    public int GetHashCode(DataRow obj)
    {
        return 42; // force Equals call
    }
}

И используйте его

var grpQuery = dt.AsEnumerable().GroupBy(r => r, new CustomEqualityComparer(groupFields));
...