0

文字列型のIEnumerableがあり、デフォルト値と修正順序があります。ランダムな順序の値を持つタイプモジュールのリストがあります。Moduleタイプの一意のオブジェクトのリストを1つ作成したいと思います。以下のコードで得られるのは、String型の一意のオブジェクトの1つのリストです。

誰かがこれに関するトリックを知っていますか?

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";
}

すべてのラムダで新しい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 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]);
}

モジュールの数が十分に多い場合は、辞書の使用もリストでの検索よりも高速になります。

于 2012-11-06T12:41:21.557 に答える
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 に答える