c# - 从 List<T> 的 List<T> 筛选

标签 c# linq lambda

我的关注基于 same question我之前问过并得到了解决方案。

我最初以为我得到了正确的回应,但事实并非如此。我的数据是这样的:

enter image description here

如果我这样过滤

var result = overdues.Where(a=>a.Accounts.Any(b=>b.AccountId.Equals("JKB2")));

我得到的结果是这样的:

enter image description here

但我希望结果只包含等于 JKB2 的帐户,而不是包含 JKB2 的帐户。因此,我在此处强调的内容应该出现在结果中,而不是其他内容:

enter image description here

从技术上讲,结果应该是这样的(我只是写了一个JSON形式的伪代码):

    [
    {
    Slab: T3,
    Value: 500,
    Percentage: 0
    Accounts: {
    AccountId:JKB2,
    AccountName:JKB2,
    SalesCode:JKB,
    Value:500
    }
    },
{
    Slab: T5,
    Value: 500,
    Percentage: 0
    Accounts: {
    AccountId:JKB2,
    AccountName:JKB2,
    SalesCode:JKB,
    Value:500
    }
    }
    ]

我的 LinqPad 工作在这里:

public class OverdueModel
    {
        public string Slab { get; set; }
        public double Value { get; set; }
        public double Percentage { get; set; }
        public List<OverdueSlabAccounts> Accounts { get; set; }
    }

    public class OverdueSlabAccounts
    {
        public string AccountId { get; set; }
        public string AccountName { get; set; }
        public string SalesCode { get; set; }
        public string Value { get; set; }
    }


void Main(){
    List<OverdueModel> overdues = new List<OverdueModel>();
    List<OverdueSlabAccounts> accounts1 = new List<OverdueSlabAccounts>();
    List<OverdueSlabAccounts> accounts2 = new List<OverdueSlabAccounts>();
    List<OverdueSlabAccounts> accounts3 = new List<OverdueSlabAccounts>();

    //For T3
    accounts1.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB1",
            AccountName = "JKB1",
            SalesCode = "JKB",
            Value = "500"
        });

    accounts1.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB2",
            AccountName = "JKB2",
            SalesCode = "JKB",
            Value = "500"
        });

    overdues.Add(new OverdueModel()
    {
        Slab = "T3",
        Value = 1000,
        Percentage = 0,
        Accounts= accounts1
    });

    //For T4
    accounts2.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB1",
            AccountName = "JKB1",
            SalesCode = "JKB",
            Value = "1000"
        });

    overdues.Add(new OverdueModel()
    {
        Slab = "T4",
        Value = 1000,
        Percentage = 0,
        Accounts= accounts2
    });

    //For T5
    accounts3.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB1",
            AccountName = "JKB1",
            SalesCode = "JKB",
            Value = "1000"
        });

    accounts3.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB2",
            AccountName = "JKB2",
            SalesCode = "JKB",
            Value = "500"
        });

    accounts3.Add(new OverdueSlabAccounts()
        {
            AccountId = "JKB3",
            AccountName = "JKB3",
            SalesCode = "JKB",
            Value = "500"
        });

    overdues.Add(new OverdueModel()
    {
        Slab = "T5",
        Value = 2000,
        Percentage = 0,
        Accounts= accounts3
    });

    //Show the Current Data
    overdues.Dump();

    var result = overdues.Where(a=>a.Accounts.Any(b=>b.AccountId.Equals("JKB2")));

    result.Dump();


}

最佳答案

过滤器是正确的,因为它返回 记录的 OverdueModel 实例;问题是您只需要内部 .Accounts 的过滤部分。如果我们假设我们不想更改所有对象,您将需要创建一个到新模型的投影,该新模型包含那些已过滤的帐户.也许是这样的:

var results = from outer in overdues
                where outer.Accounts.Any(b => b.AccountId == "JKB2")
                let filtered = outer.Accounts.FindAll(b => b.AccountId == "JKB2")
                select (Record: outer, Accounts: filtered);

尽管有多种选择是可能的。例如,一个更扁平的模型是:

var results = from outer in overdues
                from account in outer.Accounts
                where account.AccountId == "JKB2"
                select (Record: outer, Account: account);

关于c# - 从 List<T> 的 List<T> 筛选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134934/

相关文章:

c# 将 3 个集合列表合并为一个列表

c# - LINQ 查询仅计算某些值

c# - 表达式 Lambda 与语句 Lambda

C# Lambda 无法完成执行

时间:2018-01-08 标签:c#linq: Filter List of Files based on File Size

sql - Entity Framework 通过字符串sql过滤数据

c# - 在 Windows Phone 7 的 C# 中将 ArrayOfString 转换为 List<string>

c++ - 如何在 C++ 中使用可变参数泛型 lambda 计算总和?

C# 代码更改未通过 IIS 反射(reflect)

c# - Directory.GetFiles() 不适用于 "."模式