这是我的代码
var y = tb.AsEnumerable()
.GroupBy(r => new { pp1 = r[listView2.Items[0].Text],
pp2 = r[listView2.Items[1].Text] })
.Select(h => new { c1 = h.Key.pp1,
c2 = h.Key.pp2,
Total = h.Sum(s => s.Field<double>(listView3.Items[0].Text)) });
我的问题是我应该使用 ListView 项进行 GroupBy,其中包含我将 GroupBy 的列名称 但此代码只能接受 2 项
有没有办法使用字符串列表GroupBy
?
最佳答案
您可以使用以下类创建一个比较器,该比较器可以根据序列中的值(而不是基于对序列的引用)来比较项目序列:
public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
private IEqualityComparer<T> comparer;
public SequenceComparer(IEqualityComparer<T> comparer = null)
{
comparer = comparer ?? EqualityComparer<T>.Default;
}
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
return x.SequenceEqual(y, comparer);
}
public int GetHashCode(IEnumerable<T> sequence)
{
unchecked
{
int hash = 19;
foreach (var item in sequence)
hash = hash * 79 + comparer.GetHashCode(item);
return hash;
}
}
}
一旦我们有了这个,我们就可以转换您的分组选择器,以便它投影出您感兴趣的项目序列,因为它在编译时是未知的。 Select
选择器基本上没有变化。
var y = tb.AsEnumerable()
.GroupBy(row => listView2.Items.Cast<ListViewItem>()
.Select(item => row[item.Text]), new SequenceComparer<object>())
.Select(group => new
{
Values = group.Key,
Total = group.Sum(s => s.Field<double>(listView3.Items[0].Text)),
});
关于c# - GroupBy 使用字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25250700/