Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用字符串列表进行分组_C#_Linq_Group By_Enumerable - Fatal编程技术网

C# 使用字符串列表进行分组

C# 使用字符串列表进行分组,c#,linq,group-by,enumerable,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 =

这是我的密码

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)) });
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(listView3.Items[0].Text))});
我的问题是,我应该使用listview项进行分组,它包含我将分组的列名 但此代码只能接受2项


是否有任何方法可以使用字符串列表进行分组?

您可以使用以下类创建比较器,该比较器可以基于序列中的值而不是序列引用来比较项目序列:

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;
        }
    }
}

可能是@defaultlocale的副本,你有没有读过这个答案?@paqogomez有什么问题吗?问题仍然是一样的:
GroupBy
带有属性列表。@defaultlocale是的,在这里他不是根据对象的属性分组,而是根据索引器在传递N个不同字符串值时返回的值的静态属性分组。@Servy您的答案真的很棒!我投了赞成票。老实说,我甚至没有想过在这种情况下使用序列比较。无论如何,我仍然相信我第一次评论中的问题与这个问题非常接近(OP可能想看看答案)。
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)),
    });