c# - 这个表达式可以简化吗?
问题描述
我正在从一个Room
对象运行代码以将所有IRoomDwellers
特定类型的内容放入一个列表中。所有IRoomDwellers
都存储在一个静态的Dictionary<IRoomDweller,Room>
.
但是,这基本上是我第一次使用Linq
,我觉得(尽管代码似乎可以工作)该表达式相当笨拙。一方面,我真的不明白它增加了什么价值GroupBy
,但没有它似乎就无法工作。
方法如下:
private List<T> GetDwellers<T>() where T : IRoomDweller {
return RoomDwellers
.GroupBy(z => z.Value)
.SelectMany(z => z)
.Where(z => z.Value == this && z.Key is T)
.Select(z => (T) z.Key)
.ToList();
}
GroupBy 实际上有什么功能(当我最初的尝试没有奏效时,我从一个例子中抄袭了它)?并且可以以其他方式简化/使该表达式具有更高的性能吗?
解决方案
拥有一本字典(如果您有 RoomDweller,旨在用于获取 Room)并以错误的方式使用它(您有一个 Room 并想要获取 RoomDweller)并不理想,但是:
return RoomDwellers.Where(rdkvp => rdkvp.Value == this && rdkvp.Key is T)
.Select(rdkvp => rdkvp.Key)
.ToList();
RoomDwellers 是 KeyValuePair 的列表,Key 是 RoomDweller,Value 是 Room.. 所以你可以枚举 KVP 的列表,选择 Value 是这个房间的那些,然后返回关联的 Key(RoomDweller)
推荐阅读
- r - R中的二进制矩阵,每列中都有特定的矩阵
- regex - Vim 的替代命令可以将递归模式处理为 sed 的“t labe”吗?
- javascript - 从 Json 值中读取
- java - 构建 NeuralNetConfiguration 配置类时出现 deeplearning4j 错误:org.nd4j.linalg.factory.Nd4jBackend$NoAvailableBackendException
- node.js - MongoDB 聚合查询,基于参数返回模型上的 refs 集合
- python - f.write 只写入未更改的变量?
- reactjs - React 表单失去了对更新的关注
- c# - 索引超出范围。如何解决
- java - 如何在 Java 中对文件中的数据进行排序?
- google-cloud-functions - 获取 Cloud Function 实例的唯一标识符