添加两个具有相同结构的列表 C#
Adding two lists having same structure C#
所以这是我面临的问题 -
我有两个具有以下结构的列表
public class Payment
{
public int Period { get; set; }
public decimal Balance{ get; set; }
}
我创建了以下两个列表
List<Payment> A = new List<Payment>();
List<Payment> B = new List<Payment>();
列表如下所示。
List A List B
Perid Payment Perid Payment
1 10 1 16
2 12 2 13
3 45 3 44
4 23 4 33
5 36 5 34
6 45 6 35
我正在尝试添加列表 A、B 中的这两个付款,并创建应该具有相同结构的第三个列表。
List C
Perid Payment
1 10+16
2 12+13
3 45+44
4 23+33
5 36+34
6 45+35
我理解 for 循环是可能的,但是有没有可以更简单地使用 Linq 或 Lambda 表达式的地方?
非常感谢任何帮助。
试试 LINQ 的 Zip 方法。它可以帮助您同时迭代两个集合。
这是一个例子 -
using System;
using System.Linq;
class Program
{
static void Main()
{
// Two source arrays.
var array1 = new int[] { 1, 2, 3, 4, 5 };
var array2 = new int[] { 6, 7, 8, 9, 10 };
// Add elements at each position together.
var zip = array1.Zip(array2, (a, b) => (a + b));
// Look at results.
foreach (var value in zip)
{
Console.WriteLine(value);
}
}
}
我认为你不应该这样做。几乎所有阅读代码的人都会清楚以老式方式编写代码。
更重要的是,非 LINQ 代码允许您以合理的方式添加完整性检查(例如,您确定第一个列表中的所有句点都存在于第二个列表中吗?反之亦然?)。
如果你想变得更现代,我建议使用发电机,像这样:
IEnumerable<Payment> UnitePayments(List<Payment> list1, List<Payment> list2)
{
... Check that list1 and list2 are the same length ...
for(int i=0; i<list1.Length; i++)
{
if(list1.Period!=list2.Period) ... handle this case...
yield return new Payment { Period = list1.Period,
Balance = list1.Balance + list2.Balance };
}
}
您的代码读者会感谢您。
// 尝试循环我认为这是处理这种情况的好方法还有其他 LINQ 查询但我相信这更容易..
List<int> a = new List<int>();
a.Add(1 ) ;
a.Add(2);
List<int> b = new List<int>();
b.Add(5) ;
b.Add(6);
List<int> c = new List<int>();
for (int x = 0; x < a.Count; x++)
{
c.Add(a[x] + b[x]);
Label1.Text += c[x] + "";
}
如前所述,您有两个选择:-
使用 Concat + GroupBy
:-
List<Payment> result = A.Concat(B).GroupBy(x => x.Period)
.Select(x => new Payment
{
Period = x.Key,
Balance = x.Sum(z => z.Balance)
}).ToList();
使用 Zip
:-
List<Payment> result1 = A.Zip(B, (first, second) => new Payment
{
Period = first.Period,
Balance = first.Balance + second.Balance
}).ToList();
你可以参考这个Fiddle。
所以这是我面临的问题 - 我有两个具有以下结构的列表
public class Payment
{
public int Period { get; set; }
public decimal Balance{ get; set; }
}
我创建了以下两个列表
List<Payment> A = new List<Payment>();
List<Payment> B = new List<Payment>();
列表如下所示。
List A List B
Perid Payment Perid Payment
1 10 1 16
2 12 2 13
3 45 3 44
4 23 4 33
5 36 5 34
6 45 6 35
我正在尝试添加列表 A、B 中的这两个付款,并创建应该具有相同结构的第三个列表。
List C
Perid Payment
1 10+16
2 12+13
3 45+44
4 23+33
5 36+34
6 45+35
我理解 for 循环是可能的,但是有没有可以更简单地使用 Linq 或 Lambda 表达式的地方? 非常感谢任何帮助。
试试 LINQ 的 Zip 方法。它可以帮助您同时迭代两个集合。
这是一个例子 -
using System;
using System.Linq;
class Program
{
static void Main()
{
// Two source arrays.
var array1 = new int[] { 1, 2, 3, 4, 5 };
var array2 = new int[] { 6, 7, 8, 9, 10 };
// Add elements at each position together.
var zip = array1.Zip(array2, (a, b) => (a + b));
// Look at results.
foreach (var value in zip)
{
Console.WriteLine(value);
}
}
}
我认为你不应该这样做。几乎所有阅读代码的人都会清楚以老式方式编写代码。
更重要的是,非 LINQ 代码允许您以合理的方式添加完整性检查(例如,您确定第一个列表中的所有句点都存在于第二个列表中吗?反之亦然?)。
如果你想变得更现代,我建议使用发电机,像这样:
IEnumerable<Payment> UnitePayments(List<Payment> list1, List<Payment> list2)
{
... Check that list1 and list2 are the same length ...
for(int i=0; i<list1.Length; i++)
{
if(list1.Period!=list2.Period) ... handle this case...
yield return new Payment { Period = list1.Period,
Balance = list1.Balance + list2.Balance };
}
}
您的代码读者会感谢您。
// 尝试循环我认为这是处理这种情况的好方法还有其他 LINQ 查询但我相信这更容易..
List<int> a = new List<int>();
a.Add(1 ) ;
a.Add(2);
List<int> b = new List<int>();
b.Add(5) ;
b.Add(6);
List<int> c = new List<int>();
for (int x = 0; x < a.Count; x++)
{
c.Add(a[x] + b[x]);
Label1.Text += c[x] + "";
}
如前所述,您有两个选择:-
使用 Concat + GroupBy
:-
List<Payment> result = A.Concat(B).GroupBy(x => x.Period)
.Select(x => new Payment
{
Period = x.Key,
Balance = x.Sum(z => z.Balance)
}).ToList();
使用 Zip
:-
List<Payment> result1 = A.Zip(B, (first, second) => new Payment
{
Period = first.Period,
Balance = first.Balance + second.Balance
}).ToList();
你可以参考这个Fiddle。