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是考虑序列的长度的累积和。
答案 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)
}
);