如何解决C#,如何获取列表或数组中的差异
我正在寻找使用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; 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
我希望这样:
//this code does not work!!!
items.ForEach((prev,next) => Console.WriteLine($"{next} - {prev} = {next - prev}"));
谢谢。
解决方法
不确定为什么要使用这种逻辑,但是在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}");
items.Prepend(0)
返回一个列表,列表前面有0
(即{ 0,238,349 }
)
Zip
将采用这两个列表,并将提供的lambda应用于每个列表中的一个元素。我在那里提供的lambda只是将其格式化为字符串,您可以随时对其进行转换。我还使lambda变量名称更加冗长,所以您知道那些变量是什么
确定可以通过(ab?)使用LINQ Aggregate
方法来完成:
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;
这将创建所需差异的列表。如果您只想使用Console.WriteLine
,则可以将其与一个int值进行汇总并直接输出差异。
但是我希望这只是出于知识的考虑,实际上,在这种情况下,imo只是坚持使用for循环,更加简洁。
如果要使用LINQ ForEach
并执行Console.WriteLine
,则可以选择以下另一种方法:
var previous = 0;
items.ForEach(item =>
{
if (previous.HasValue)
Console.WriteLine($"{item} - {previous} = {item - previous}");
previous = item;
});
但是再次使用for
循环没错。我真的感到人们对使用LINQ进行所有操作的渴望视而不见。
编辑:我看到您要求忽略第一个“怪异”输出,基本上跳过了第一个值,这是在两种情况下的查找方式:
var differences = items.Aggregate(new { Previous = (int?)null,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;
});
,
@ChristophLü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
@AndrewMorton谢谢你。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。