Union / Merge 2不同类型的列表,并返回LINQ的一个类型的列表

时间:2012-11-06 12:20:44

标签: c# linq

我有一个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"},

4 个答案:

答案 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);