【问题标题】:LINQ as a method parameterLINQ 作为方法参数
【发布时间】:2012-01-02 02:20:32
【问题描述】:

我有一个像这样的简单对象

public class Test
{
   public string Name {get; set;}
}

后来我有List<Test> tests

然后我有一个方法可以处理列表中的Test 对象。

private void DoSomething(Test test)
{
   //do some serious stuff here!
}

然后在应用程序中,这个Test 对象将被填充到 TreeView 中,并且在用户单击它们后,它们将被传递给上面的方法。目前我发现选择的树节点是这样的:

string name = selectedNode.Text;

foreach(Test test in tests)
{
   if (test.Name = name) DoSomething(test);
}

所以我的想法是,我想不出一种在方法的参数中使用 LINQ 的方法,而不是做那个无聊的 foreach 循环。

this.DoSomething(from x in tests where x.Name = "What I need to pass" select x)

怎么了?

谢谢!

【问题讨论】:

  • 我很确定你不能在方法中使用 LINQ 作为参数,就像你不能使用匿名类型一样。
  • 即使我在参数中的linq之前强制转换(测试)?
  • 对不起,我的意思是在 foreach 循环中:if (test.Name = name) DoSomething(test);
  • 如果您只需要/期望 1 次测试,请致电 DoSomething((for ...).Single())

标签: c# linq


【解决方案1】:
this.DoSomething(tests.FirstOrDefault(x=>x.Name=="What I need to pass"))

【讨论】:

    【解决方案2】:

    您实际上是在此处进行搜索。假设名称是唯一的,您可以这样做:

    var selectedTest = tests.SingleOrDefault(test => test.Name == selectedNode.Text);
    if (selectedTest != null)
    {
        DoSomething(selectedTest);
    }
    

    【讨论】:

    • 这与我已经在做的 foreach 循环并没有太大的不同。我正在寻找直接使用 linq 作为参数。
    • 这与使用 foreach 循环有何不同?验证?为什么要省略它? IMO 最好在调用您的私有方法之前进行验证,而不是在其中进行验证。
    • 是的,您对验证的看法是正确的......它不应该被忽略。我只是对在参数中使用 linq 感到好奇。
    【解决方案3】:

    一个 linq 查询会产生一个 IQueriable 对象。所以你可以用它作为论据。

    【讨论】:

      【解决方案4】:

      下面的 sn-p 可以工作。除非您在 DoSomething 方法中检查空案例,否则我不会推荐它。您应该运行 LINQ 查询首先存储结果并检查它们,然后再将它们传递给新方法。

      this.DoSomething(
           (from x in tests 
            where x.Name = "What I need to pass" 
            select x).FirstOrDefault() as Test);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 2013-01-03
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2013-07-18
        相关资源
        最近更新 更多