LINQ可以用于在单个操作中搜索多个列表吗?

时间:2015-03-11 00:23:01

标签: c# linq collections

我有一些清单:

    KeyedCollection<int, InstantiatedObjectsListType> ActiveUnitList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> ActiveBuildingList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> ActiveUIList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> ActiveManagersList = new InstantiatedObjectListCollection();

    KeyedCollection<int, InstantiatedObjectsListType> DisabledUnitList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> DisabledBuildingList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> DisabledUIList = new InstantiatedObjectListCollection();
    KeyedCollection<int, InstantiatedObjectsListType> DisabledManagersList = new InstantiatedObjectListCollection();

我想通过键或值来检查对象是否在这些列表中的任何一个。可以使用LINQ在一次操作中搜索所有8个列表,还是需要在链中使用8个单独的操作?

据我所知,我可以有多个操作一次搜索一个列表,但为了整洁,我宁愿将其压缩成单个操作。

2 个答案:

答案 0 :(得分:3)

您可以联合这些列表并搜索结果。

ActiveUnitList
.Union(ActiveBuildingList)
.Union(ActiveUIList)
.Where(...)

答案 1 :(得分:0)

您可能还会考虑重新调整代码以删除重复并提供更快的查找速度。

看起来你有4种类型可以是Active或Disabled,所以你应该可以在4种类型上设置一个接口:

 public interface IDisableable
 {
     bool IsActive();
 }

然后你可以用一个字典来查找Id的所有内容

private Dictionary<int, IDisableable> disableableObjectsById;

然后获取活动对象是这样的:

var activeObjectsWithId = disableableObjectsById.Where(kvp => kvp.Value.IsActive());

根据您对集合的其他操作,您可以使用对象使用的其他接口以及其他类型的集合。