【发布时间】:2017-10-23 15:03:46
【问题描述】:
我是 c# 编程新手,有以下场景。
我正在使用一个返回 IEnumerable 的 API,我想根据一些对象属性对其进行迭代:
IEnumerable<objects> listOfObjects = filter.getItems(id);
List<CustomObject> sortedList = new List<CustomObject>();
foreach (CustomObject obj in listOfObjects )
{
obj.Load(Load.Expanded);
sortedList.Add(obj);
}
foreach (CustomObject custObj in sortedList.OrderByDescending(c => c.RevisionDate))
{
// business logic
}
我需要执行以上所有操作,因为我无法对过滤器查询中返回的对象进行类型转换。此外,从过滤器查询返回的对象未加载,这意味着如果我不执行第一个 foreach 循环,则第二个 foreach 中的 RevisionDate 值将为空。
我想知道是否有更好的方法来处理这种情况,是否可以通过 1 个循环消除这些行数?
【问题讨论】:
-
你这样做的方式非常好。如果它没有加载 obj 状态的副作用,它可以被简化。我认为目前的情况很好。
-
首先,您只需将
.OfType<CustomObject>()添加到第一行的末尾即可进行转换。其次,如果您使用的框架没有加载对象,那么请使用另一个框架。 -
@PeterMorris:不,您使用
.Cast<CustomObject>()进行投射。您使用OfType进行过滤。它不同的原因是因为如果你不小心让listOfObjects有一些NotCustomObject,那么你的人会默默地过滤掉它们,从而隐藏你的问题,而Cast方法会抛出异常,因为你有错误的对象. -
@Chris 如果您假设您想要一个错误,那么是的,如果您假设您不想要,那么不是。我想这是信息不足的情况。
-
@Chris - 看起来他正在使用某种对象持久性框架,尽管他提供了他知道的对象的 ID,但他的检索器正在返回一个基类而不是他想要的后代类属于那个子类。他说他是 C# 的新手,这让我期待他使用“cast”这个词来解释他的要求,因为尽管使用了“过滤器”,但他不知道任何替代方法(如过滤)。如果我们做出假设,那么任何一个都可能是正确的。正如我所说,这是
not enough information的一个案例,可以确定其中任何一个都是正确的。