【问题标题】:Merge Two Complicated Lists in C#在 C# 中合并两个复杂的列表
【发布时间】:2020-09-15 08:12:15
【问题描述】:

我有一个场景。

对象层次结构如下:

a)有两个对象。

例如。 A.com,B.Com

a)每个对象中都有卡片列表。

例如。 VISA、万事达等。

b)每张卡包含多个分期号码和利率 例如。 2.2,3.3.等

现在我必须通过一定的限制来合并两个对象。

1) A.com 始终优先,表示 A.com 和 B.com 发生两次常见的分期付款,然后 A.com 中的 Rates 将采取。

2)如果 A.com 中没有 Rates,但 B.com 中发生,B.com 中的 Rate 为 Take。

下图给出了一个更好的主意:

我需要使用 Linq 来实现它。 请帮助我,因为我在这和 Linq 的新手中被困了几天。

【问题讨论】:

  • 使用 linq 是什么意思?使用 linq 函数?那么什么linq函数呢?你用的是什么数据结构?它似乎是键值对,而不是列表。
  • 我的意思是 Linq 函数。它不是键值对。
  • @您是在 linq 查询的帮助下提取这些列表吗?分享您的模型和存储方式
  • 如果您想使用 LINQ 提取数据,您的源序列应该是 IQueryable<...>IEnumerable<...>。请编辑您的问题并在您的序列中添加类的(相关部分)描述。还要更清楚地定义您的要求:什么是分期付款?两期什么时候常见?显然分期付款有费率?你想用利率做什么?请添加适当的要求

标签: c# .net list linq merge


【解决方案1】:

下面的演示

效率警告:对于如图所示的小列表,这很好,但对于较大的列表,请考虑排序列表以允许 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

【讨论】:

    【解决方案2】:

    您可以同时使用ConcatLookupAggregate。您没有向我们展示您的对象定义,因此我假设:

    类定义

    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(),
    };
    

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 2014-08-30
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多