C#,如何获取列表或数组中的差异
我正在寻找使用LINQ计算数组或列表中两个项目之间差异的方法。C#,如何获取列表或数组中的差异,c#,linq,C#,Linq,我正在寻找使用LINQ计算数组或列表中两个项目之间差异的方法。 我认为ExtensionMethod是另一个很好的解决方案,但我想知道如何通过LINQ来实现它。 请帮帮我 var items = new List<int> { 238, 348, 274, 490, 459, 349 }; Console.WriteLine($"{items[0]} - 0 = {items[0]}"); for (int i = 1; i < items.Count
我认为ExtensionMethod是另一个很好的解决方案,但我想知道如何通过LINQ来实现它。
请帮帮我
var items = new List<int> { 238, 348, 274, 490, 459, 349 };
Console.WriteLine($"{items[0]} - 0 = {items[0]}");
for (int i = 1; i < items.Count; i++)
{
Console.WriteLine($"{items[i]} - {items[i-1]} = {items[i] - items[i-1]}");
}
result:
238 - 0 = 238
348 - 238 = 110
274 - 348 = -74
490 - 274 = 216
459 - 490 = -31
349 - 459 = -110
谢谢。不确定为什么需要这种逻辑,但在LINQ中实现这一点的一种方法是使用
Zip
,如下所示:
var items = new List<int> { 238, 348, 274, 490, 459, 349 };
var results = items.Prepend(0)
.Zip(items,
(itemFromPrepended, itemFromOriginal) =>
$"{itemFromOriginal} - {itemFromPrepended} = {itemFromOriginal - itemFromPrepended}");
var items=新列表{23834827490459349};
var结果=项目。预结束(0)
.Zip(项目、,
(ItemFromPrepend,itemFromOriginal)=>
$“{itemFromOriginal}-{ItemFromPrepend}={itemFromOriginal-ItemFromPrepend}”);
items.Prepend(0)
返回一个前面有0
的列表(.即{023834827449045949}
)
Zip
将获取这两个列表,并将提供的lambda应用于每个列表中的一个元素。我在那里提供的lambda只是将其格式化为字符串,您可以任意转换它。我还使lambda变量名更为详细,这样您就可以知道这些变量是什么了确保可以通过使用LINQAggregate
方法(ab?)来实现这一点:
var differences = items.Aggregate(new { Previous = 0, List = new List<int>()}, (aggregate, current) =>
{
aggregate.List.Add(current - aggregate.Previous);
return new { Previous = current, aggregate.List};
}).List;
但是使用for
循环也没有什么错。我真的感觉到人们盲目地想用LINQ做任何事情
编辑:我看到您要求忽略第一个“怪异”输出,基本上跳过第一个值,这两种情况下都是这样:
var differences = items.Aggregate(new { Previous = (int?)null, List = new List<int>()}, (aggregate, current) =>
{
if (aggregate.Previous.HasValue)
aggregate.List.Add(current - aggregate.Previous.Value);
return new { Previous = (int?)current, aggregate.List};
}).List;
int? previous = null;
items.ForEach(item =>
{
if (previous.HasValue)
Console.WriteLine($"{item} - {previous} = {item - previous}");
previous = item;
});
var differences=items.Aggregate(new{Previous=(int?)null,List=new List()},(Aggregate,current)=>
{
if(聚合.Previous.HasValue)
聚合.List.Add(当前-聚合.Previous.Value);
返回新的{Previous=(int?)current,aggregate.List};
}).名单;
智力?previous=null;
items.ForEach(item=>
{
if(上一个.HasValue)
WriteLine($“{item}-{previous}={item-previous}”);
先前=项目;
});
@Christoph Lütjen谢谢你的建议。我试着解决了它
int last = 0;
items.Aggregate(last, (prev,next) => {
Console.WriteLine($"{next} - {prev} = {next - prev}");
return next;
}, next => last);
result:
238 - 0 = 238
348 - 238 = 110
274 - 348 = -74
490 - 274 = 216
459 - 490 = -31
349 - 459 = -110
@安德烈·莫尔顿也谢谢你
var result = string.Join(Environment.NewLine, items.Zip(items.Skip(1),
(a, b) => $"{b} - {a} = {b - a}"));
Console.WriteLine(result);
//result
348 - 238 = 110
274 - 348 = -74
490 - 274 = 216
459 - 490 = -31
349 - 459 = -110
您可以编写扩展方法:谢谢您的评论。但我想通过LINQ了解它。您可以使用
Aggregate()
,或者这可能会有所帮助:@JaeChulKim这些值是唯一的吗?您的第一行238-0没有意义,或者没有逻辑。您的程序无法给出您显示的结果。OP澄清了他们不需要“238-0”行,所以只要string.Join(“\r\n”,items.Zip(items.Skip(1),(a,b)=>$”{b}-{a}={b-a}”)
就可以使用Zip
@AndrewMorton获得答案,谢谢。我错过了评论。是的,你的评论应该能解决这个问题case@AndrewMorton谢谢。如果您传入一个累加器函数而不是内联编写代码,那么使用Aggregate()将非常有意义。例如,items.Aggregate(MyAccumerators.DiffWithLast)
。与扩展功能相比,您可以保持intellisense的干净。
int last = 0;
items.Aggregate(last, (prev,next) => {
Console.WriteLine($"{next} - {prev} = {next - prev}");
return next;
}, next => last);
result:
238 - 0 = 238
348 - 238 = 110
274 - 348 = -74
490 - 274 = 216
459 - 490 = -31
349 - 459 = -110
var result = string.Join(Environment.NewLine, items.Zip(items.Skip(1),
(a, b) => $"{b} - {a} = {b - a}"));
Console.WriteLine(result);
//result
348 - 238 = 110
274 - 348 = -74
490 - 274 = 216
459 - 490 = -31
349 - 459 = -110