【问题标题】:Use Linq insted of Foreach (C#) [closed]使用 Linq 而不是 Foreach (C#) [关闭]
【发布时间】:2020-05-26 07:15:22
【问题描述】:

我有foreach:

public string myLookingValue;
...

foreach(var item in selected.Something)
{
  var check = item.Parameters.ToList();

  foreach(var lookingValue in check)
  {
     if(lookingValue.Value == "TEST")
       myLookingValue = lookingValue.Key;
  }
}

可以不运行第二个foreach吗?只使用Linq

【问题讨论】:

  • 你试过SelectMany吗?
  • 性能可以通过调用'break;'来提高当你找到你正在寻找的价值时。
  • 你为什么不直接写 myLookingValue = „TEST“ ?你的循环对我来说似乎没用。
  • 请提供课程
  • 像@Yuriy 已经做了item.Parameters .Where(lookingValue => lookingValue.Value == "TEST").ToList(); 然后for循环,如果需要的话,基本上改变你的内部循环来过滤 where 而不是通过每个项目然后检查......我知道它就像同样一样,但它的效率不是。

标签: c# function linq loops foreach


【解决方案1】:

如果selected.Something.Parameters 中的至少一个 等于"Test",您似乎想将"TEST" 分配给myLookingValue

如果是你的情况

   using System.Linq; 

   ...

   myLookingValue = selected
     .SelectMany(item => item.Parameters)
     .Any(item => item.Value == "TEST") ? "TEST" : myLookingValue;

编辑:如果你想先找出等于"TEST"item.Value并在这种情况下分配item.Key

   myLookingValue = selected
     .SelectMany(item => item.Parameters)
     .Where(item => item.Value == "TEST")
     .Select(item => item.Key)
     .DefaultIfEmpty(myLookingValue)
     .First();

【讨论】:

  • 如何插入“测试”分配 item.key ?
  • @4est:在这种情况下,您可以尝试过滤 (WHERE),然后返回 (First) item.KeymyLookingValue 如果过滤返回空光标
  • 感谢您的快速周转
【解决方案2】:

我相信这将是最干净的解决方案:

if (selected.Something.Any(item => item.Parameters.Any(param => param.value.Equals("TEST"))))
            myLookingValue = "TEST";

【讨论】:

    【解决方案3】:
    item.Parameters
        .Where(lookingValue => lookingValue.Value == "TEST")
        .ToList()
        .ForEach(lookingValue => myLookingValue = lookingValue.Value);
    

    A.你的代码可读性很好,我不会改变它。

    B.为什么要不断重置 myLookingValue 的值?你是故意的吗

    myLookingValue = selected.Something
        .SelectMany(item => item.Paremeters)
        .Single(lookingValue => lookingValue.Value == "TEST").Value;
    

    【讨论】:

    • 哈哈,那是作弊。严格来说,您不是使用 linq“运行第二个 foreach”...
    • Single抛出异常 如果我们有 两个或更多 "TEST";如果我们没有"TEST",我们也会有异常
    【解决方案4】:

    SelecteMany 将为您解决问题。

    selectedItem.SelectMany(obj=>obj.Parameters))
                .Foreach(param=>{do whatever you want to do})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多