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

Cri*_*onX 4 c# linq lambda removeall

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

        for (int index = 0; index < 4; index++)
        {
          Log.RemoveAll(log =>
                    (log.Program[index].Version[0].Value +
                     log.Program[index].Version[1].Value +
                     log.Program[index].Version[2].Value ) > 60);
        }
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助!


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

// I'm restricted to Arrays, but if I had lists, this would work. 
  internal class MyLogCollection
  {
    List<MyLog> MyListOfZones = new List<MyLog>();

    public void TestRemove()
    {
      // Original Implementation
      for (int i = 0; i < 4; i++)
      {
        MyListOfZones.RemoveAll(log => (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<MyZone> MyZoneArray = new List<MyZone>(4);

  }
  internal class MyZone
  {
    //public MyVersion[] MyVersionArray = new MyVersion[3];
    public List<MyVersion> MyVersionArray = new List<MyVersion>(3);
  }
  internal class MyVersion
  {
    public byte Value { get; set;}

  }
Run Code Online (Sandbox Code Playgroud)

谢谢tzaman!

tza*_*man 8

应该这样做,我想:

Log.RemoveAll(log => 
              log.Program.Any(prog => 
                              prog.Version.Sum(ver => ver.Value) > 60));
Run Code Online (Sandbox Code Playgroud)


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

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

    public static IEnumerable<MyVersion> Enumerate(this MyVersionArray version)
    {
        for (int i = 0; i < version.Length; i++)
            yield return version[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

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