我有一个IEnumerable类型的String,默认值和修订顺序。 我有一个类型为List的List,其值随机顺序排列。 我想要一个Module类型的唯一对象列表。 我从以下代码得到的是: 一个String类型的唯一对象列表。
有人知道这个伎俩吗?
static void Main(string[] args) {
List<Module> moduleList = new List<Module>() {
new Module{ ModuleId = 1, ModuleType = "world"},
new Module{ ModuleId = 2, ModuleType = "wayne"},
new Module{ ModuleId = 3, ModuleType = "hallo"},
new Module{ ModuleId = 4, ModuleType = "tes"},
new Module{ ModuleId = 5, ModuleType = "mi"},
new Module{ ModuleId = 6, ModuleType = "haha"},
new Module{ ModuleId = 7, ModuleType = "pipi"},
new Module{ ModuleId = 8, ModuleType = "bla"},
};
// This result is fine that the list is unified and the predefined
// values order is not changed: bla, tes, mi
// BUT I need to return a query with Module objects
var query = GetDefaultValues().Union(moduleList.Select(t => t.ModuleType));
}
private static IEnumerable<string> GetDefaultValues() {
yield return "bla";
yield return "tes";
yield return "mi";
}
在每个lambda中执行一个新的Module()并为我复制值是NO选项。
更新
期望的输出:
模块列表:
new Module{ ModuleId = 8, ModuleType = "bla"},
new Module{ ModuleId = 4, ModuleType = "tes"},
new Module{ ModuleId = 5, ModuleType = "mi"},
new Module{ ModuleId = 1, ModuleType = "world"},
new Module{ ModuleId = 2, ModuleType = "wayne"},
new Module{ ModuleId = 3, ModuleType = "hallo"},
new Module{ ModuleId = 6, ModuleType = "haha"},
new Module{ ModuleId = 7, ModuleType = "pipi"},
答案 0 :(得分:0)
尝试此查询:
var query = GetDefaultValues()
.Select(t => moduleList
.Where(mo => mo.ModuleType == t)
.Single())
.Union(moduleList);
答案 1 :(得分:0)
如果您可以将模块列表更改为模块类型映射的模块字典,则此代码将返回IEnumerable<Module>
static void Main(string[] args)
{
var moduleList = new Dictionary<string, Module> {
{"world", new Module{ ModuleId = 1, ModuleType = "world"}},
{"wayne", new Module{ ModuleId = 2, ModuleType = "wayne"}},
...
};
IEnumerable<Module> query = GetDefaultValues().Select(val => moduleList[val]);
}
如果模块的数量足够大,使用Dictionary也会比在列表中搜索更快。
答案 2 :(得分:0)
var query = GetDefaultValues()
.Select(v => moduleList.Find(m => m.ModuleType == v))
.Union(moduleList);
答案 3 :(得分:0)
我不确定我是否理解这个问题,但是如果您只想获取有序的字符串并获得相应的模块,则可以使用:
var modulesByType = moduleList.ToDictionary(m=>m.ModuleType);
var result = GetDefaultValues().Select(moduleType=>modulesByType[moduleType]);
如果您因某些原因想避免构建字典,也可以使用:
Func<string, Module> getModule = moduleType => moduleList.Single(m=>m.ModuleType == moduleType);
var result = GetDefaultValues().Select(getModule);