gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:18:09 26 4
gpt4 key购买 nike

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

  • 我的 SomeObject 有一个属性 string Status我对此场景感兴趣。
  • Status 属性可以准确包含“Open”、“Closed”、“Finished”值。
  • 我有一个方法叫做 FilterObjects返回 List<SomeObject>
  • 方法接受与其返回类型相同的参数,List<SomeObject>
  • 方法应该根据下面解释的以下情况进行过滤并返回对象列表。
  • List<SomeObject>我发送的参数保证我的方法是有序的(通过它们的 ID 和类型)。

案例是(都与我提到的 string Status 属性相关):

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

  2. 如果任何项目包含Status = Finished但包含“CLOSED”,我需要检查在“CLOSED”之后是否还有任何其他项目具有“Open”的值。您可以将其视为“任务可以关闭,但可以重新打开。但是一旦完成,就无法重新打开”。

    如果它包含一个“CLOSED”并且在该项目之后没有任何“OPEN”,我将忽略 CLOSED 之前的所有项目并且只返回 CLOSED 对象。如果它在任何关闭后包含“OPEN”,我需要通过排除自身来返回关闭后的任何内容。

我也尝试用我出色的 MS Paint 技能来解释同样的事情。

enter image description here

对象本身问题不大,但是我的方法是这样的:

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>();
}

长话短说,在这个单一方法中应用所有这些逻辑的最佳和最有效的方法是什么?老实说,我不能比我已经实现的第一个案例更进一步,也就是 FINISHED。这整个事情可以用一些 LINQ 魔法来完成吗?

我保证会收到一个有序的 list ,而且我收到的元素永远不会超过几百件,所以我的收藏永远不会庞大。

非常感谢您的帮助。

最佳答案

你可以尝试这样的事情:

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;
}

关于C# 根据多个条件过滤列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com