【发布时间】:2011-02-22 11:41:03
【问题描述】:
我目前有一个日志对象,我想根据 LINQ 查询从中删除对象。如果程序中的版本总和大于 60,我想删除日志中的所有记录。目前我很有信心这会起作用,但它似乎很笨拙:
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 个值的数组。有没有更简单的方法可以在不使用 for 循环的情况下在 LINQ 中执行 RemoveAll?
提前感谢您的帮助!
编辑: 不幸的是,Program 和 Version 所基于的变量类型(这是我正在使用的框架的一个约束)限制了我们,以至于我无法访问“Any”成员。但是,如果您有 lists,我通过创建一些示例代码确认了 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;}
}
谢谢你!
【问题讨论】:
-
只是
Any不起作用,或者没有一个LINQ 运算符起作用?它是常规的System.Array类型,还是带有重载索引运算符的自定义类型?如果是后者,您将无法使用 LINQ afaik,除非您能以某种方式从中获得IEnumerable。你可以很容易地定义一个扩展方法来为你做这件事(使用for循环和yield return)......如果你需要一个例子,我可以更新我的答案。 -
@tzaman - 抱歉回复晚了 - 没有一个操作员工作。它是一个“类似数组”的对象,我 90% 确信它不是系统数组类型。我知道它现在不是 IEnumerable :-/。如果您确实知道如何创建 IEnumerable,我将不胜感激 :-)