[英]Assign Values from one list to Another list based on Id
您能否帮助我根据 id 从另一个列表 1 中为列表 2 分配值,这是两个列表结构,它们是两个类的对象:
List 1 object :
public class Person
{
int id;
string fnName;
string lnName;
}
List 2 Object:
public class Payment
{
int paymentId;
string paymentType;
IEnumerable<string> paymentPersonIds;
IEnumerable<Person> PersonDetails;
}
基本上,我从一个函数获取列表 1 的数据,从另一个函数获取列表 2 数据,如果PaymentPersonIds
与列表 1 id 匹配,我需要填写付款列表中的个人详细信息?
也许是这样的:
list1.Where(c => payment.paymentPersonIds.ToList().Contains(c.id.ToString()));
此外,我建议对您的代码进行一些修改,例如您需要将以下内容视为属性:
public class Person
{
public int Id { get; set; }
public string FnName { get; set; }
public string LnName { get; set; }
}
https://dotnetfiddle.net/qJ8Kf8
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var List1 = new List<Person>{
new Person{
id = 1,
fnName = "bla"
}, new Person{
id = 2,
fnName = "bla2"
}
};
var List2 = new List<Payment>{
new Payment{
paymentId = 1,
paymentType = "type1",
paymentPersonIds = new string[]{"1"},
PersonDetails = Enumerable.Empty<Person>(),
},
new Payment{
paymentId = 2,
paymentType = "type2",
paymentPersonIds = new string[]{"1","2"},
PersonDetails = Enumerable.Empty<Person>(),
}
};
List2.ForEach(l2 => {
var personList = new List<Person>();
l2.paymentPersonIds.ToList().ForEach(id => {
var matched = List1.FirstOrDefault(l1 => l1.id.ToString().Contains(id));
if (matched != null)
{
personList.Add(matched);
}
});
l2.PersonDetails = personList as IEnumerable<Person>;
});
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(List2));
}
}
public class Person
{
public int id;
public string fnName;
public string lnName;
}
public class Payment
{
public int paymentId;
public string paymentType;
public IEnumerable<string> paymentPersonIds;
public IEnumerable<Person> PersonDetails;
}
}
正如其他答案所说,您应该使用属性而不是字段。
我会为此使用 linq
foreach (Payment payment in payments)
{
payment.PersonDetails = persons.Where(p => payment.PaymentPersonIds.Contains(p.ToString()));
}
这是完整的代码:
public class Person
{
public int Id { get; set; }
public string FnName { get; set; }
public string LnName { get; set; }
}
public class Payment
{
public int PaymentId { get; set; }
public string PaymentType { get; set; }
public IEnumerable<string> PaymentPersonIds { get; set; }
public IEnumerable<Person> PersonDetails { get; set; }
/// <summary> FIll PersonDetails property using Linq </summary>
/// <param name="payments">List of payments</param>
/// <param name="persons">List of persons</param>
public static void FillPersonDetailsLinq(List<Payment> payments, List<Person> persons)
{
foreach (Payment payment in payments)
{
payment.PersonDetails = persons.Where(p => payment.PaymentPersonIds.Contains(p.Id.ToString()));
}
}
/// <summary> FIll PersonDetails property without using Linq </summary>
/// <param name="payments">List of payments</param>
/// <param name="persons">List of persons</param>
public static void FillPersonDetails(List<Payment> payments, List<Person> persons)
{
foreach (Payment payment in payments)
{
List<Person> matches = new List<Person>();
foreach (Person person in persons)
{
if (payment.PaymentPersonIds.Contains(person.Id.ToString()))
{
matches.Add(person);
}
}
payment.PersonDetails = matches;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.