LINQ用于获取元组值和聚合等等到新元组中?

有一个小问题,因为我将我的元组重构成一个新的元组,我在重构所有项目时感到害怕,我想添加到我的新元组:什么不是’b’,然后是’b’的总和,然后重复直到列表结束,问题是,我不想使用循环,但现在我很谦卑,我开放循环建议,但仍然,有一个linq方式来做到这一点更容易吗? 我听说聚合是我可以使用的示例代码:

var newList = new List<Tuple>(); newList.Add(new Tuple('q', .3M)); newList.Add(new Tuple('w', .4M)); //.7 newList.Add(new Tuple('b', 1.2M)); //1.2 newList.Add(new Tuple('r', .3M)); newList.Add(new Tuple('e', .8M)); //1.1 newList.Add(new Tuple('b', 1.2M)); //1.2 newList.Add(new Tuple('b', 1.2M)); //1.2 newList.Add(new Tuple('b', 1.2M)); //1.2 var refactoredList = new List<Tuple>(); refactoredList.Add( new Tuple( 's', newList.TakeWhile(x => x.Item1 != 'b').Sum(x => x.Item2))); refactoredList.Add( new Tuple( 'b', newList.Where(x => x.Item1 == 'b').Select(x => x.Item2).First())); 

我不确定你的意思,但这里有一个示例代码,它给你两组元组

  var sumOfB = newList .GroupBy(x => x.Item1) .Where(g => g.Key == 'b') .Select(s => Tuple.Create('b', s.Sum(t=> t.Item2))); var sumOfNotB = newList .GroupBy(x => x.Item1) .Where(g => g.Key != 'b') .Select(s => Tuple.Create('s', s.Sum(t => t.Item2))); 

LinqPad结果

不确定你究竟在做什么。 看起来你得到了连续b和非b值的总和。 写一个发电机。

 IEnumerable> AggregateGroups(IEnumerable> data) { var state = default(char?); var sum = 0M; foreach (var item in data) { if (state != null && state.Value == 'b' ^ item.Item1 == 'b') { yield return Tuple.Create(state.Value, sum); sum = 0M; } state = item.Item1 == 'b' ? 'b' : 's'; sum += item.Item2; } if (state != null) yield return Tuple.Create(state.Value, sum); } 

然后使用它:

 var data = new[] { Tuple.Create('q', .3M), Tuple.Create('w', .4M), //.7 Tuple.Create('b', 1.2M), //1.2 Tuple.Create('r', .3M), Tuple.Create('e', .8M), //1.1 Tuple.Create('b', 1.2M), //1.2 Tuple.Create('b', 1.2M), //1.2 Tuple.Create('b', 1.2M), }; var result = AggregateGroups(data).ToList(); 

这导致列表:

 (s, 0.7) (b, 1.2) (s, 1.1) (b, 3.6)