如何从List()中获取整数值的总计?

时间:2011-01-18 12:51:58

标签: c# linq list sorting

List包含具有以下属性的对象:

public class PropertyDetails
{

 public int Sequence { get; set; }

 public int Length { get; set; }

 public string Type { get; set; }

 public int Index { get; set; }

}

列表将排序序列。

List的对象值如下:

序列= 1长度= 20类型=“”索引= 0

序列= 2长度= 8类型=“”索引= 0

序列= 3长度= 6类型=“”索引= 0

序列= 4长度= 20类型=“”索引= 0

序列= 5长度= 8类型=“”索引= 0

我想要Linq查询,它会将结果列表作为

序列= 1长度= 20Type =“”索引= 20

序列= 2长度= 8类型=“”索引= 28

序列= 3长度= 6类型=“”索引= 34

序列= 4长度= 20类型=“”索引= 54

序列= 5长度= 8类型=“”索引= 62

其中index是考虑序列的长度的累积和。

3 个答案:

答案 0 :(得分:9)

我从来没有说过这个,但我发现Jon的解决方案是过度工程化。相反,我发现LINQ是这个问题的错误解决方案。你想操纵状态,不适合传统的LINQ操作符。

我只是这样做:

var sum = 0;
foreach (var p in list) {
  sum += p.Length;
  p.Index = sum;
}

LINQ是一把锤子。确保使用正确的工具解决问题,而不仅仅是要求锤击建议。

答案 1 :(得分:3)

没有标准的LINQ运算符可以执行此操作 - 基本上您需要运行聚合。你现在可以用带有副作用的查询伪造它,但就是这样。

幸运的是,编写自己的查询运算符很容易。类似的东西:

public static IEnumerable<TResult> Scan<TSource, TResult>(
    this IEnumerable<TSource> source,
    TResult seed,
    Func<TResult, TSource, TResult> func)
{
    TResult current = seed;
    // TODO: Argument validation
    foreach (TSource item in source)
    {
        current = func(current, item);
        yield return current;
    }
}

然后你可以使用:

var query = list.Scan(new PropertyDetails(),
                      (current, item) => new PropertyDetails { 
                           Sequence = item.Sequence,
                           Length = item.Length,
                           Index = current.Index + item.Length
                      });

编辑:我没有检查细节,但我相信Reactive Extensions在其System.Interactive程序集中有类似的方法。

答案 2 :(得分:-2)

也许这样的事情(它不太可读):

var newList = list.Select(x =>
                        new PropertyDetails()
                        {
                            Type = x.Type,
                            Length = x.Length,
                            Sequence = x.Sequence,
                            Index = list.Take(x.Sequence).Select(y => y.Length).Aggregate((a, b) => a + b)
                        }
);