0

我有一个字符串类型的 IEnumerable,具有默认值和修复顺序。我有一个 Module 类型的列表,其值以随机顺序排列。我想要一个模块类型的唯一对象列表。我用下面的代码得到的是:一个字符串类型的唯一对象列表。

有人知道这个技巧吗?

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 中执行一个 new Module() 并复制这些值对我来说不是选项。

更新:

期望的输出:

模块列表:

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

4 回答 4

0
var query = GetDefaultValues()
            .Select(v => moduleList.Find(m => m.ModuleType == v))
            .Union(moduleList);
于 2012-11-06T12:44:49.007 回答
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);
于 2012-11-06T14:40:41.713 回答
0

试试这个查询:

var query = GetDefaultValues()
               .Select(t => moduleList
                               .Where(mo => mo.ModuleType == t)
                               .Single())
               .Union(moduleList);
于 2012-11-06T12:39:35.777 回答
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 也会比在列表中搜索更快。

于 2012-11-06T12:41:21.557 回答