【问题标题】:How to Convert following code (foreach and if) into linq in c#?如何在 C# 中将以下代码(foreach 和 if)转换为 linq?
【发布时间】:2018-08-07 10:02:45
【问题描述】:

如何将以下每个转换为 Linq,如果可能的话,将 If 语句也包含到 Linq 中。?

public class InvalidDataType
    {
        public string ViewName { get; set; }
        public string ControlName { get; set; }
        public string DataValue { get; set; }
    }

foreach (InvalidDataType invalidField in DataObjectManager.GetInvalidFields())
           {
                if (invalidField.ControlName == "tbMCBNumber")
                {
                    fieldToRemove = invalidField;
                    break;
                }
            }
            if (fieldToRemove != null)
            {
                DataObjectManager.GetInvalidFields().Remove(fieldToRemove);
            }

这是我试过的代码

DataObjectManager.GetInvalidFields().Where(x => x.ControlName == "tbMCBNumber").Remove();

【问题讨论】:

  • 恐怕这不是代码编写服务。您需要表现出一些努力并向我们展示您的尝试。
  • 为什么不自己做呢?我们为什么要做你的工作?这是尝试和思考。当您有特定问题时,您可以在这里提问。
  • 另外,是什么让您认为 Linq 会是一个很好的解决方案?

标签: c# .net linq


【解决方案1】:

Where 只返回一个 集合,它不会修改现有 集合。这就是 LINQ 中 Q 的含义:查询。这意味着 linq 不是设计的,因此在修改集合时并不是很好。这就是为什么在修改集合中的元素时不应该使用 LINQ。

如果您的GetInvalidFields-方法返回List<T>,您可以执行以下操作:

DataObjectManager.GetInvalidFields().RemoveAll(x => x.ControlName == "tbMCBNumber");

但这不是 LINQ,它只是 ICollection<T> 的一种方法,List<T> 实现了它。

或者,您可以使用一个向后计数的 for 循环来从中删除一些项目:

var list = DataObjectManager.GetInvalidFields();
for(int i = list.Count - 1; i >= 0; i--)
{
    if(list[i].ControlName == "tbMCBNumber").Remove(list[i]);
}

然而,这假设您甚至可以修改GetInvalidFields 返回的基础 集合。如果该方法返回一些根本无法修改的内容,例如 ReadOnlyCollection 或只是 en 迭代器,则无法从中删除项目。

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 2014-03-18
    • 2021-08-24
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多