【问题标题】:Would appreciate assistance with .OrderBy and group/cross join非常感谢 .OrderBy 和 group/cross join 方面的帮助
【发布时间】:2019-05-01 02:31:22
【问题描述】:

我在这里有一个两部分的问题。首先,我要通过键的值来缩小类实例的列表。这个,我做到了;但是,接下来我将按人的姓氏升序存储结果。我可能可以处理这个,除了名称字符串在值中包含名字和姓氏。如何按名称字符串的姓氏对类的实例进行排序?我确定这是 .OrderBy 是解决方案的一个实例,但我不知道将其插入到我的 .ToList() 参数中的何处以及如何告诉编译器使用哪个字符进行排序。

List<Customer> customers = new List<Customer>() {
  new Customer(){ Name="Bob Lesman", Balance=80345.66, Bank="FTB"},
  new Customer(){ Name="Joe Landy", Balance=9284756.21, Bank="WF"},
  new Customer(){ Name="Meg Ford", Balance=487233.01, Bank="BOA"},
  new Customer(){ Name="Peg Vale", Balance=7001449.92, Bank="BOA"},
  new Customer(){ Name="Mike Johnson", Balance=790872.12, Bank="WF"},
  new Customer(){ Name="Les Paul", Balance=8374892.54, Bank="WF"},
  new Customer(){ Name="Sid Crosby", Balance=957436.39, Bank="FTB"},
  new Customer(){ Name="Sarah Ng", Balance=56562389.85, Bank="FTB"},
  new Customer(){ Name="Tina Fey", Balance=1000000.00, Bank="CITI"},
  new Customer(){ Name="Sid Brown", Balance=49582.68, Bank="CITI"}
        };

List<ReportItem> millionaireReport = customers.Where(customer => customer.Balance >= 1000000).Select(customer => new ReportItem( customer.Name, customer.Bank )).ToList();

List<Bank> banks = new List<Bank>() {
  new Bank(){ Name="First Tennessee", Symbol="FTB"},
  new Bank(){ Name="Wells Fargo", Symbol="WF"},
  new Bank(){ Name="Bank of America", Symbol="BOA"},
  new Bank(){ Name="Citibank", Symbol="CITI"},
        };

练习的继续是Console.WriteLine 过滤和排序的结果,用银行名称代替缩写/股票代码以“{Customer.Name} at {Bank.Name}”的方式。我们被告知要阅读并尝试使用 Group Join 或 Cross Join。我已通读示例,但仍在尝试理解。非常感谢任何帮助!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    困难的部分是确定名称的哪一部分是“姓氏”部分,因为并非所有文化都相同(例如,某些客户是否会有中间名 - 或两个,有些文化也会使用他们的“姓氏” “ 第一的)。

    最简单的解决方案是这样的:

    customers.OrderBy(c=>c.Name.Split(' ')[1].ToUpper())
    

    虽然这假定名称将始终采用如下格式:

    $"{firstName} {lastName}"
    

    没有其他空格,也没有中间名。它也没有考虑到像“McDouglas”这样的姓氏前缀

    关于银行符号与银行名称的匹配:

    foreach (var customer in customers)
    {
        var bank = banks.FirstOrDefault(b=>string.Equals(b.Symbol, customer.Bank, StringComparison.OrdinalIgnoreCore)
        if (bank != default)
        {
            // your logic here
        }
    }
    

    【讨论】:

    • OrderBy(c=&gt;c.Name.Split(' ')[1] 正是我一直在寻找的,并且工作得很好。谢谢你。关于练习第二部分的任何想法;将银行的全名加入其股票代码?
    • @CharlesBelcher 我已经更新了我的答案以包含问题的第二部分。如果这回答了您的问题,请将我的答案标记为正确(在答案分数下方打勾)
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2014-07-27
    • 2021-09-03
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多