Mic*_*yne 5 .net c# linq algorithm list
首先,我这里的情况是...
string Status我对这个场景感兴趣的属性。FilterObjects它返回一个List<SomeObject>List<SomeObject>List<SomeObject>我送作为参数我的方法是保证在顺序(通过他们的ID和类型)。这些案例是(都与string Status我提到的财产有关):
如果列表中的任何项目包含,Status = "Finished";则消除原始列表中的所有其他元素并仅返回具有“已完成”状态的对象。
如果任何项目没有不包含Status = Finished但包含“封闭”,我需要检查是否存在具有“开放”的后“封闭”一个值的任何其他项目。您可以将其视为“任务可以关闭,但可以重新打开。但一旦完成,就无法重新打开”。
如果它包含一个“CLOSED”并且在该项目之后没有任何“OPEN”,我将忽略 CLOSED 之前的所有项目并且只返回 CLOSED 对象。如果它在任何关闭后包含“OPEN”,我需要通过排除自身来返回关闭后的任何内容。
我也尝试用我很棒的 MS Paint 技能来解释同样的事情。
对象本身并不是真正的问题,但我的方法是这样的:
private List<SomeObject> FilterObjects(List<SomeObject> objectList)
{
var objects = objectList;
var returnList = new List<SomeObject>();
foreach (var obj in objects)
{
if (obj.Status == "Finished")
{
returnList.Add(obj);
return returnList;
}
}
return new List<SomeObject>();
}
Run Code Online (Sandbox Code Playgroud)
长话短说,在这种单一方法中应用所有这些逻辑的最佳和最有效的方法是什么?老实说,我不能比我已经实现的第一个案例更进一步,那就是 FINISHED。这整个事情可以用一些 LINQ 魔法来完成吗?
保证我会收到一个有序列表,而且我永远不会收到超过几百件的物品,因此收藏永远不会很大。
非常感谢您的帮助。
你可以尝试这样的事情:
private List<SomeObject> FilterObjects(List<SomeObject> objectList)
{
SomeObject finished = objectList.FirstOrDefault(o => o.Status.Equals("Finished"));
if (finished != null) { return new List<SomeObject> { finished }; }
List<SomeObject> closed = objectList.SkipWhile(o => !o.Status.Equals("Closed")).ToList();
if (closed.Count == 1) { return closed; }
if (closed.Count > 1) { return closed.Skip(1).ToList(); }
// if you need a new list object than return new List<SomeObject>(objectList);
return objectList;
}
Run Code Online (Sandbox Code Playgroud)