c# - 使用 LINQ 比较两个列表,并使用一个或另一个的结果生成第三个列表
问题描述
我有两个元素列表,它们仅在IsTemporalPaymentTerm
布尔字段上有所不同。
我想使用 LINQ 逐个比较这两个列表,并生成第三个列表,对于每个条目,该列表具有 where IsTemporalPaymentTerm = true
,如果没有,那么我想要一个 where 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);
所以,基本上我想要的是与 进行比较onlyTemporalResults
,nonTemporalResults
并获得一个最终列表,其中包含临时支付期限,或者如果找不到临时支付期限,则为非临时支付期限。
伪代码示例:
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 子句?
到目前为止,我还没有看到答案。提前致谢!
解决方案
这是你要找的吗?
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}");
}
}
推荐阅读
- c++ - 我尝试实现 curl 脚本以请求服务器,但它不工作
- csv - Neo4j:导入 csv - 引用错误,但文件中没有引号
- python - 如何使用包含过滤数据帧 DatetimeIndex
- python - 如何在 tkinter 中更改组合框的背景颜色?
- gstreamer - 使用 ximagesrc 绘制窗口会在图像周围产生黑色边框
- javascript - @change on select 传递没有属性的参数“事件”
- javascript - 从数组回调数据时出现类型错误
- swiftui - 使用按钮添加用户输入的数据
- php - 如何计算数组中的唯一值并存储在另一个数组 PHP 中?
- javascript - 部署时条件始终为真的 Vue.js v-bind 类