c# - c# 使用 linq 在一个属性上过滤两个列表

标签 c# linq

我有两个对象,即 CardTransaction:

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> cardDetailsList<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/

相关文章:

c# - EntityFramework 在转换为基类型时抛出绑定(bind)异常

c# - 在另一个 IList 数据模型中存储 Array 或 IList

c# - 尽管为它们分配了值,但 DataRows 还是出现空值

c# - 如何使用 C# mongodb 在 linq 中使用小写字母

c# - 打开 XML : Delete entire excel column using column index

C# INSERT ERROR MYSQL Server Version 为附近的用户提供正确的语法

c# - 同时访问2个线程上的对象

c# - 使用 LINQ,如何根据部分字符串属性过滤集合?

c# - 在 Linq 谓词中,编译器会优化对 Enumerable.Min() 的 "scalar"调用还是会为每个项目调用它?

c# - 比较相邻的列表项