2012-11-06 54 views
0

我有一個具有默認值和修復順序的字符串類型的IEnumerable。 我有一個隨機順序值的類型模塊列表。 我想擁有一個Module類型的唯一對象列表。 我得到的代碼如下: String類型的唯一對象的一個​​列表。不同類型的聯合/合併2列表,並返回LINQ的一種類型的列表

有人知道這個訣竅嗎?

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選項。

UPDATE:

所需的輸出:

模塊列表:

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

請顯示所需的輸出的完整內容。 – dasblinkenlight

+0

當你不創建它們時,你期望如何獲取模塊?也許工廠是你的選擇?通過這種方式,您可以向工廠提供一串字符串列表,並獲取模塊列表。 – KroaX

+1

@dasblinkenlight完成! – Elisabeth

回答

0
var query = GetDefaultValues() 
      .Select(v => moduleList.Find(m => m.ModuleType == v)) 
      .Union(moduleList); 
+0

你的答案是最容易的:) – Elisabeth

0

嘗試此查詢:

var query = GetDefaultValues() 
       .Select(t => moduleList 
           .Where(mo => mo.ModuleType == t) 
           .Single()) 
       .Union(moduleList); 
0

如果你可以改變的模塊列表成爲由模塊ty映射的模塊字典PE,那麼這個代碼將返回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]); 
} 

使用字典也將更快的搜索,然後在列表中,如果模塊的數量足夠大的查詢。

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