我目前有一个日志对象,我想根据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);
}
程序是一个包含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;}
}
谢谢tzaman!
答案 0 :(得分:8)
我应该这样做,我想:
Log.RemoveAll(log =>
log.Program.Any(prog =>
prog.Version.Sum(ver => ver.Value) > 60));
编辑:好的,这里是如何添加扩展方法以从可索引的“类数组”对象中获取IEnumerable
,以便您可以在它们上使用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]
}
}
我假设MyZoneArray
和MyVersionArray
类型有Length
字段,但如果没有,您可以在那里放4
和3
。有了这些,您现在可以调用集合对象上的Enumerate()
函数来获取集合的IEnumerable
版本,并附加所有相关的LINQy良好:log.MyZoneArray.Enumerate().Any( ... )