【问题标题】:Use LINQ to compare two lists, and produce a third one with results from one OR the other使用 LINQ 比较两个列表,并生成第三个列表,其中一个或另一个的结果
【发布时间】:2021-05-20 04:00:58
【问题描述】:

我有两个元素列表,它们仅在 IsTemporalPaymentTerm 布尔字段上有所不同。

我想使用 LINQ 逐个比较这两个列表,并生成第三个列表,其中每个条目都有 IsTemporalPaymentTerm = true 的位置,如果没有则,那我想要IsTemporalPaymentTerm = false的那个。

这里有一些示例代码:

var allResults = db.PaymentTerms
                       .AsQueryable()
                       .Where(y => y.WorkDate == date
                               && y.ProjectID == ProjectID 
                               && y.CompanyID == CompanyID
                               && y.PayeeID == PayeeID);

//TABLE WITH ONLY TEMPORAL PAYMENT TERMS
var onlyTemporalResults = allResults.Where(x => x.IsTemporalPaymentTerm);

//TABLE WITH ONLY NON-TEMPORAL PAYMENT TERMS
var nonTemporalResults = allResults.Where(x => !x.IsTemporalPaymentTerm);

所以,基本上我想要的是将 onlyTemporalResultsnonTemporalResults 进行比较,并获得一个包含临时付款期限非临时付款期限的最终列表如果找不到临时付款期限。

伪代码示例:

List<PaymentTerms> TemporalPaymentTerms = new List<PaymentTerms>();
PaymentTerm unnaprovedPT1 = new PaymentTerm  { PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false };
PaymentTerm unnaprovedPT2 = new PaymentTerm  { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false };

TemporalPaymentTerms.Add(unnaprovedPT1); 
TemporalPaymentTerms.Add(unnaprovedPT2);  
   
List<PaymentTerms> NonTemporalPaymentTerms = new List<PaymentTerms>();
PaymentTerm approvedPT1 = new PaymentTerm  { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true};
PaymentTerm approvedPT1 = new PaymentTerm  { PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true};

//LINQ query that merges both lists goes here.
    
//FINAL EXPECTED RESULT:
List<PaymentTerms> FinalList = [
{PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false},
{PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false},
{PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true}
];

我知道这可以遍历两个列表(临时和非临时付款条款),然后比较它们,但我想我的问题是:

这是否可以使用单个 LINQ 查询更高效、更优雅地完成?也许我缺少某种形式的加入?条件 Where 子句?

到目前为止,我还没有看到答案。提前致谢!

【问题讨论】:

  • 那是很多散文。你能提供一些代码吗?也许你正在使用的类?
  • @Llama 我在下面添加了一些带有简短描述的示例代码,我认为这会使事情更加清晰。
  • @Llama 还压缩了文本以使问题不那么冗长。
  • 这是一个很大的进步! :) 不幸的是我不知道答案,但希望现在您的问题更容易消化,有人能够更轻松地提供答案。

标签: c# .net performance entity-framework linq


【解决方案1】:

这是你要找的吗?

static void Main(string[] args)
{
    RunPaymentTermsTest();
    Console.WriteLine("Done!");
    Console.ReadLine();
}

private static void RunPaymentTermsTest()
{
    var temporalPaymentTerms = new List<PaymentTerm>
    {
        new PaymentTerm { PayeeID = 1, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false },
        new PaymentTerm { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = false }
    };

    var nonTemporalPaymentTerms = new List<PaymentTerm>()
    {
        new PaymentTerm { PayeeID = 2, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true },
        new PaymentTerm { PayeeID = 3, CompanyID = 2, ProjectID = 3, IsTemporalPaymentTerm = true }
    };

    var toAdd = temporalPaymentTerms
        .Where(x =>
            !nonTemporalPaymentTerms.Any(y =>
                y.CompanyID == x.CompanyID &&
                y.PayeeID == x.PayeeID &&
                y.ProjectID == x.ProjectID))
        .ToList();

    var results = nonTemporalPaymentTerms;
    results.AddRange(toAdd);

    foreach (var result in results.OrderBy(x => x.PayeeID).ThenBy(x => x.CompanyID).ThenBy(x => x.ProjectID))
    {
        Console.WriteLine(
            $"PayeeID: {result.PayeeID}, CompanyID: {result.CompanyID}, ProjectID: {result.ProjectID}, IsTemporalPaymentTerm: {result.IsTemporalPaymentTerm}");
    }
}

【讨论】:

  • 就是这样!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多