C# 根据多个条件过滤列表中的项目

Mic*_*yne 5 .net c# linq algorithm list

首先,我这里的情况是...

  • 我的 SomeObject 有一个string Status我对这个场景感兴趣的属性。
  • 状态属性可以准确地包含“打开”、“关闭”、“已完成”值。
  • 我有一个方法调用FilterObjects它返回一个List<SomeObject>
  • 方法接受与其返回类型相同的参数, List<SomeObject>
  • 方法应该根据下面解释的以下情况进行过滤并返回对象列表。
  • List<SomeObject>我送作为参数我的方法是保证在顺序(通过他们的ID和类型)。

这些案例是(都与string Status我提到的财产有关):

  1. 如果列表中的任何项目包含,Status = "Finished";则消除原始列表中的所有其他元素并仅返回具有“已完成”状态的对象。

  2. 如果任何项目没有包含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 魔法来完成吗?

保证我会收到一个有序列表,而且我永远不会收到超过几百件的物品,因此收藏永远不会很大。

非常感谢您的帮助。

Kev*_*lis 4

你可以尝试这样的事情:

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)