Назначить значения из одного списка в другой список на основе идентификатора - PullRequest
3 голосов
/ 17 января 2020

Не могли бы вы помочь мне в Присвоении значений для Списка 2 из другого Списка 1 на основе идентификатора, Вот структура двух списков, которые являются объектом двух классов:

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?

Ответы [ 3 ]

2 голосов
/ 17 января 2020

Может быть что-то вроде этого:

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 голосов
/ 17 января 2020

Как говорят другие ответы, вы должны использовать свойства вместо полей.

Я бы использовал для этого 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;
        }
    }
}
0 голосов
/ 17 января 2020

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

...