Объединить два сложных списка в C# - PullRequest
0 голосов
/ 28 мая 2020

У меня есть сценарий.

Иерархия объектов, как показано ниже:

a) Есть два объекта.

например. A.com, B.Com

a) Список карт находится в каждом объекте.

например. VISA, MasterCard.et c.

б) Каждая карта содержит номер многократного платежа и процентные ставки, например. 2.2,3.3.et c

Теперь мне нужно объединить два объекта с помощью определенного ограничения.

1) Приоритет всегда для A.Com, означает, что в A .com и B.com, тогда ставки в A.com будут приниматься.

2) Если в A.com, а в B.com нет ставок, то в B.com будет приниматься ставка.

Изображение ниже дает лучшее представление: Merge idea

Мне нужно реализовать это с помощью Linq. Пожалуйста, помогите мне, ребята, так как я застрял на несколько дней в этом и новом ie в Linq.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Демо ниже

Предупреждение об эффективности: это нормально, чтобы получить однострочник для крошечных списков, как показано, но для больших рассмотрите отсортированные списки, чтобы разрешить слияние O (m + n) вместо O (m * n).

  class Program
  {
    private static readonly List<Tuple<int, double>> A = new List<Tuple<int, double>>
                                                         {
                                                           new Tuple<int, double>(1, 2.2),
                                                           new Tuple<int, double>(2, 2.3),
                                                           new Tuple<int, double>(3, 2.4)
                                                         };
    private static readonly List<Tuple<int, double>> B = new List<Tuple<int, double>>
                                                         {
                                                           new Tuple<int, double>(1, 2.2),
                                                           new Tuple<int, double>(3, 3.1),
                                                           new Tuple<int, double>(6, 3.4)
                                                         };

    static void Main(string[] args)
    {
      var merged = A.Concat(B.Where(iB => A.All(ia => ia.Item1 != iB.Item1)));
      Console.WriteLine("Merge(A,B): ");
      foreach (var (item1, item2) in merged) 
        Console.WriteLine($"  {item1}, {item2}");
      Console.ReadKey();
    }
  }

Производит

Merge(A,B):
  1, 2.2
  2, 2.3
  3, 2.4
  6, 3.4
1 голос
/ 28 мая 2020

Вы можете использовать Concat, Lookup и Aggregate вместе. Вы не показали нам свое определение объекта, поэтому я предполагаю:

Определение класса

public class InstallmentInterestRate
{
    public int Installment { get; set; }
    public double Interest { get; set; }
}
public class Acom
{
    public List<InstallmentInterestRate> Visa { get; set; }
    public List<InstallmentInterestRate> MS { get; set; }
    public List<InstallmentInterestRate> AX { get; set; }
}

public class Bcom
{
    public List<InstallmentInterestRate> Visa { get; set; }
    public List<InstallmentInterestRate> MS { get; set; }
    public List<InstallmentInterestRate> AX { get; set; }
}

Linq:

Acom acom = new Acom()
{
    Visa = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 2.2},
        //other values
    },
    MS = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 2.2},
        //other values
    },
    AX = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 2.2},
        //other values
    }
};

Bcom bcom = new Bcom()
{
    Visa = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 2.2},
        //other values
    },
    MS = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 4.0},
        //other values
    },
    AX = new List<InstallmentInterestRate>()
    {
        new InstallmentInterestRate(){ Installment = 1, Interest = 2.2},
        //other values
    }
};

var merged = new
{
    Visa = acom.Visa.Concat(bcom.Visa)
        .ToLookup(p => p.Installment)
        .Select(g => g.Aggregate((p1, p2) => new InstallmentInterestRate
        {
            Installment = p1.Installment,
            Interest = p1.Interest
        })).ToList(),
    MS = acom.MS.Concat(bcom.MS)
        .ToLookup(p => p.Installment)
        .Select(g => g.Aggregate((p1, p2) => new InstallmentInterestRate
        {
            Installment = p1.Installment,
            Interest = p1.Interest
        })).ToList(),
    AX = acom.AX.Concat(bcom.AX)
        .ToLookup(p => p.Installment)
        .Select(g => g.Aggregate((p1, p2) => new InstallmentInterestRate
        {
            Installment = p1.Installment,
            Interest = p1.Interest
        })).ToList(),
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...