【问题标题】:if..if else..else..in linq to objectsif..if else..else..in linq to objects
【发布时间】:2011-12-07 17:41:56
【问题描述】:

给定一个包含多行的 DataView,我想根据以下条件提取一行;

  • 如果一行以某个字符串开头并以某个字符串结尾,则选择该行高于所有其他行
  • 如果没有行满足第一个条件,则只需查找以特定字符串开头的行
  • 如果我们无法匹配上述任何一项,则默认为 null。

我的快速尝试只是返回满足任何条件的第一行(如果 VB 语法不正确,请原谅,我不太熟悉);

  Dim result = (From row In dv.Table.Rows() _
                Where (GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) AndAlso _
                GetString(row, "id").EndsWith(Me.ID.Substring(Me.RegisteredID.Length - 2, 2), StringComparison.OrdinalIgnoreCase)) OrElse _
                GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) _
                Select row).FirstOrDefault()

编辑:我的意思是补充一点,像https://stackoverflow.com/a/443055/685760 这样的东西看起来很有希望,但我认为它不适用于我的情况。如果我错了,请随时纠正我。

【问题讨论】:

    标签: linq conditional


    【解决方案1】:

    如果不是不可能的话,在查询中表达这种算法是很困难的。查询只会独立于其他行来判断每一行。 您需要先获得第一个条件的结果集,然后才能检查第二个条件...

    在我看来,您需要执行三个单独的查询(如果返回任何结果,则可能只执行第一个查询,因为此时您满足了第一个条件并且不需要检查其他结果) . 我猜另一种方法是通过某种数据排名,但您最终可能会得到一些不太清晰且性能较差的结果。

    无论如何,即使有办法在查询中表达您的需求,您的代码对于普通人的可读性也会提高一百倍。有这样的事情过度使用 Linq ;)

    【讨论】:

    • 我也很怀疑。我只是希望得到证实。我只是不确定是否有一些适用的扩展方法或 linq 魔法,但仍然像我希望的那样使看似复杂的查询工作,并让它对普通凡人可读:)
    • 将其拆分为两个查询(使用 cmets)使其具有可读性且不笨重。我并不是想在每种情况下都使用 linq 作为我的锤子,但我认为最好在数据视图和多个 for 循环上进行过滤。这两个查询似乎运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多