【问题标题】:Predicate to use Find on a List of Tuple在元组列表上使用 Find 的谓词
【发布时间】:2016-11-05 16:59:39
【问题描述】:

我有这个Dictionary

Public TblDic As New Dictionary(Of String, List(Of Tuple(Of Date, Date, Decimal)))

我需要检索在第 2 项上具有最高日期的元组的第 3 项(十进制)。

我可以通过知道日期来检索第三项,但我无法检索到最高日期:

Dim LastDate As Date = Date.ParseExact("31/12/2016", "dd/MM/yyyy",
                                       New CultureInfo("it-IT"), DateTimeStyles.None)
Dim LastRate2 As Decimal = TblDic("Legali").Find(Function(D) D.Item2 = LastDate).Item3

另一种方法是将所有元组放入 DataTable 并使用 DataTable.Select 以这种方式检索十进制字段:

Dim LastRate As Decimal = DT_Rates.Select("EndDate=MAX(EndDate)")(0).Field(Of Decimal)("Rate")

所以,我的问题是:
1) 是否可以在不知道最后日期的情况下使用 List.Find?
2) List.Find 和 DataTable.Select 之间的最佳实践是什么?

【问题讨论】:

    标签: vb.net list find predicate


    【解决方案1】:

    可以使用 Find... 也许?但我认为没有它就足够简单了。

    Dim LastRate As Decimal = TblDic.
        SelectMany(Function(k) k.Value).
        OrderByDescending(Function(k) k.Item2).
        First().Item3
    

    SelectMany() 采用许多序列并将它们展平为一个序列。本例中的序列是字典的值,List(Of Tuple(Of Date, Date, Decimal))

    OrderByDescending() 按谓词排序展平序列,谓词返回Tuple(Of Date, Date, Decimal)Date。这将 all 将所有列表中的Tuple(Of Date, Date, Decimal) 排序,因为它们被展平了

    First() 采用按日期降序排列后的第一个 Tuple(Of Date, Date, Decimal)

    Item3 返回Tuple(Of Date, Date, Decimal)Decimal

    【讨论】:

    • 感谢您的回答,但我有一些问题要问您:您是否考虑过,如果我使用Find,我可以避免填充DataTable?还有:可以直接使用TblDic.OrderByDescending吗? (我试过但没有成功)。
    • 我的回答与DataTable无关;它是通用集合上的纯 LINQ。如果您订购字典,您仍然只有一个列表字典。虽然有很多迂回的方法可以通过这样做来达到你想要的结果,但我能想到的任何事情都会比我的答案更复杂。您是否尝试过我的回答,如果可以,是否有效?
    • 你是正确的!这是我阅读您的代码的误解。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多