LINQ:如何在不使用For循环与Array的情况下使用RemoveAll

我目前有一个日志对象,我想根据LINQ查询删除对象。 如果程序中的版本总和大于60,我想删除日志中的所有记录。目前我非常有信心这可行,但它看起来像kludgy:

for (int index = 0; index  (log.Program[index].Version[0].Value + log.Program[index].Version[1].Value + log.Program[index].Version[2].Value ) > 60); } 

该程序是一个包含4个值的数组,版本具有3个值的数组。 有没有更简单的方法在LINQ中执行此RemoveAll而不使用for循环?

在此先感谢您的帮助!


编辑:不幸的是,程序和版本所基于的变量类型(这是我正在使用的框架的约束)限制了我们,使得我无法访问“任何”成员。 然而,我确认如果你通过创建一些示例代码来获得列表 ,那么tzaman的解决方案是有效的。 我被限制为类似数组的变量(参见注释掉的区域)

 // I'm restricted to Arrays, but if I had lists, this would work. internal class MyLogCollection { List MyListOfZones = new List(); public void TestRemove() { // Original Implementation for (int i = 0; i  (log.MyZoneArray[0].MyVersionArray[0].Value + log.MyZoneArray[0].MyVersionArray[1].Value + log.MyZoneArray[0].MyVersionArray[2].Value) > 60); //"Any" method is not available off of intellisense scope on MyZoneArray } // Better Implementation (thanks tzaman!) MyListOfZones.RemoveAll(log => (log.MyZoneArray.Any(prog => prog.MyVersionArray.Sum(ver => ver.Value) > 60))); } } internal class MyLog { //public MyZone[] MyZoneArray = new MyZone[4]; public List MyZoneArray = new List(4); } internal class MyZone { //public MyVersion[] MyVersionArray = new MyVersion[3]; public List MyVersionArray = new List(3); } internal class MyVersion { public byte Value { get; set;} } 

谢谢tzaman!

应该这样做,我想:

 Log.RemoveAll(log => log.Program.Any(prog => prog.Version.Sum(ver => ver.Value) > 60)); 

编辑:好的,所以这里是如何添加扩展方法从可索引的“类数组”对象中获取IEnumerable ,以便您可以在它们上使用LINQ:

 static class MyExtensions { public static IEnumerable Enumerate(this MyZoneArray zone) { for (int i = 0; i < zone.Length; i++) yield return zone[i]; } public static IEnumerable Enumerate(this MyVersionArray version) { for (int i = 0; i < version.Length; i++) yield return version[i] } } 

我假设MyZoneArrayMyVersionArray类型有一个Length字段,但如果没有,你可以在那里放入43 。 有了这些,您现在可以调用集合对象上的Enumerate()函数来获取集合的IEnumerable版本,并附加所有相关的LINQy良好: log.MyZoneArray.Enumerate().Any( ... )