我有两个对象,即 Card 和 Transaction:
Card:
public string CardID {get; set;}
public string TransactionRef {get; set;}
Transaction:
public string TxnID {get; set;}
public string TxnDetails {get; set;}
注意: TransactionRef
格式为 Date|TxnID
我还有两个对象的列表 List<Card> cardDetails
和 List<Transaction> transDetails
cardDetails:
{CardID = '1', TransactionRef = '20150824|Guid1'}
{CardID = '2', TransactionRef = '20150824|Guid2'}
{CardID = '3', TransactionRef = '20150824|Guid3'}
transDetails:
{TxnID = '23', TxnDetails = 'Guid1'}
{TxnID = '24', TxnDetails = 'Guid2'}
我想使用基于 TxnDetails 的 transDetails 过滤 cardDetails,以便它从第二个列表中过滤掉不包含 TxnDetails 的项目。
这应该是输出:
cardDetails:
{CardID = '3', TransactionRef = '20150824|Guid3'}
我用 linq 试过这样的:
cardDetails = cardDetails.Where(x => transDetails.Any(y => x.TransactionRef.Contains(y.TxnDetails) == false)).ToList();
但它始终将列表返回为空白。我已经尝试过此查询的许多变体,但均未成功。我知道这个问题在搜索他们并尝试他们的解决方案之前和之后都被问过,但我仍然无法正确解决。
任何人都可以建议我的查询有什么问题吗?
注意:我忘记提及的一件事是这些列表可以包含 1000 条记录。所以性能也很重要。
最佳答案
应该这样做
var cards =
from card in cardDetails
let txnDetails = GetTxnDetails(card)
where ! transDetails.Any(t => t.TxnDetails == txnDetails)
select card;
static string GetTxnDetails(Card card)
{
return card.TransactionRef.Split('|')[1];
}
fiddle :https://dotnetfiddle.net/b9ylFe
稍微优化一下的一种方法是将所有可能的交易详细信息预先存储在哈希集中。然后查找应该非常接近 O(1)(假设哈希码分布公平)而不是 O(n) - 将算法的整体复杂性从 O(n * k) 降低到 O(n + k)。
var allTxnDetails = new HashSet<string>(transDetails.Select(t => t.TxnDetails));
var cards =
from card in cardDetails
let txnDetails = GetTxnDetails(card)
where ! allTxnDetails.Contains(txnDetails)
select card;
fiddle :https://dotnetfiddle.net/hTYCbj
关于c# - c# 使用 linq 在一个属性上过滤两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177443/