数据表:通过LINQ或LAMBDA进行动态分组依据 [英] DataTable: dynamic Group By expression by LINQ or LAMBDA
问题描述
我有一个DataTable,我要在其中分组一个未指定数量的字段.这就是为什么用户可以选择要分组的字段的原因.
i've a DataTable in which i want to Group By for an unspecified number of fields. This happens why user can choose fields on which he wants to group.
因此,实际上,我将选择放在列表中.在这种选择下,我必须将我的数据表分组.
So, actually, i push the choise in a List. And on this choise i have to group my DataTable.
想象一下这段代码(VB或C#是相同的):
Imagine this piece of code (VB or C# is the same):
public void groupFieldsFN(DataTable dt, List<string> groupFields){
var grpQuery = dt.AsEnumerable().GroupBy(r => [***groupFields***]);
}
我该怎么办?在这种情况下,我该如何表达GroupBy表达式.
What can i do ? How can i express GroupBy expression in this context.
很明显,LINQ或LAMBDA解决方案是相同的.
Clearly, LINQ or LAMBDA solution is the same.
预先感谢您的帮助.
_
解决方案
阿列克斯·安德烈耶夫(Aleks Andreev)的回应行之有效!非常感谢.
Aleks Andreev's response works! Thanks much.
推荐答案
您可以在GroupBy
调用中使用自定义相等比较器.定义比较器:
You can use custom equality comparer in GroupBy
call. Define your comparer:
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));
这篇关于数据表:通过LINQ或LAMBDA进行动态分组依据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!