使用linq按字符串分组/聚集[]

丹尼斯

假设我有一个包含Tuple.First的列表作为字符串[](即我的钥匙):

var lst = new List<Tuple<string[], int>> {
     new Tuple<string[], int>(new string[] { "A", "B" }, 5),
     new Tuple<string[], int>(new string[] { "A", "B" }, 10),
     new Tuple<string[], int>(new string[] { "C", "B" }, 10),
}

我想通过Tuple.First聚合(例如Sum)(即string []),因此期望输出如下:

var output = new List<Tuple<string[], int>> {
     new Tuple<string[], int>(new string[] { "A", "B" }, 15),
     new Tuple<string[], int>(new string[] { "C", "B" }, 10),
}

我这样做,但是必须有一种更清洁的方法来代替强制管道连接:

var output = lst
    .GroupBy(x => string.Join("|", x.First))
    .Select(x => new Tuple<string[], int>( 
             x.Key.Split('|'),   
             Sum(x => x.Second)));
莱斯泽克·马祖(Leszek Mazur)

您需要实现IEqualityComparerstring[]我使用touples的示例(您不说什么Pair):

static void Main(string[] args)
{
    var lst = new List<(string[] arr, int num)> {
        (new string[] { "A", "B" }, 5),
        (new string[] { "A", "B" }, 10),
        (new string[] { "C", "B" }, 10),
    };

    var grouped = lst.GroupBy(pair => pair.arr, new EnumerableComparer());
    var sums = grouped.Select(g => (arr: g.Key, num: g.Sum(p => p.num)));
}

class EnumerableComparer<TRecord> : IEqualityComparer<IEnumerable<TRecord>>
    {
        public bool Equals(IEnumerable<TRecord> x, IEnumerable<TRecord> y)
        {
            return ReferenceEquals(x, y) || x != null && x.SequenceEqual(y);
        }

        public int GetHashCode(IEnumerable<TRecord> lst)
        {
            unchecked
            {
                int hash = 387;
                foreach (var elem in lst)
                {
                    hash = hash * 31 + elem.GetHashCode();
                }

                return hash;
            }
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章