基于 Id 将一个列表中的值分配给另一个列表

3

请问您能帮我将一个id基于的另一个List 1中的值赋给List 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;

}

基本上,我从一个函数获取List 1的数据,从另一个函数获取List 2的数据,如果PaymentPersonIds与List 1 id匹配,我需要在Payment List中填写个人详细信息。


请问您可以分享一下您目前尝试过的内容吗?这样我们就可以帮助您解决面临的问题了。 - Anu Viswan
你应该重新考虑 Payment 类的设计,我认为它应该是一个单一的“支付”条目。包括 PaymentIdPaymentTypePersonId 的公共属性。然后,你可以创建一个 List<Payment>,其中包含不同人员的支付条目。此外,你应该在对象中创建公共属性而不是字段。 - user10216583
3个回答

2
也许是这样的:

可能是这样的:

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; }
}

0

正如其他答案所说,您应该使用属性而不是字段。

我会使用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;
        }
    }
}

-1

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;
    }
}


这个答案非常接近,我更新了我的问题,请您再检查一遍。 - uttam rao
我已经更新了我的答案。它对于给定的示例值有效 :) - sachith sujeewa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接