c# - GroupBy 使用字符串列表

标签 c# linq group-by enumerable

这是我的代码

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/

相关文章:

c# - 基于下一个元素值的 LINQ 条件聚合

sql - Postgresql 一张表多次计数

Python 分组

c# - 如何在 Emgu CV 中使用 CvInRange

c# - ZMQ recv 随机拾取垃圾数据 有谁知道为什么?

asp.net - 如何使用自定义控件修复 ViewState 序列化错误?

C# MVC ViewModel 返回 Null - 回传

c# - 是否可以返回调用者无法修改的只读 ObservableCollection?

c# - 命名空间中不存在类型或命名空间名称 - 但命名空间确实存在

python - 为什么我无法获得 Python 迭代器的倒数第二个结果?