如何在C#中将以下代码(foreach和if)转换为linq?

时间:2018-08-07 10:02:46

标签: c# .net linq

如何将以下内容分别转换为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();

1 个答案:

答案 0 :(得分:0)

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或仅是迭代器,则无法删除其中的项目。

相关问题