2015-01-10 2 views
0

У меня есть список номеров деталей:выражения Linq, чтобы присоединиться к списку и словарь

var parts = new List<string> {"part1", "part2", "part3"}; 

У меня также есть словарь количества этих номера деталей:

var quantities = new Dictionary<string, int> {{"part1", 45}, {"part3", 25}}; 

Учитывая разграничитель |, мне нужно расположить эти значения в плоском файле так:

SalesRep|part1|part2|part3 
Mr. Foo|45||25 

То, что я хотел бы d o определяет строку, которая независимо от того, какие значения находятся в parts и quantities, я могу применить это к имени торгового представителя, чтобы он напоминал приведенный выше пример.

Похоже, что я должен быть в состоянии сделать это с string.Join() на перечислимой операции LINQ, но я не могу понять, что заявление будет получить мне IEnumerable<string> результат от присоединения к parts и quantities. Он думал, что это будет .Join(), но подпись кажется неправильной. Может кто-нибудь просветить меня?

ответ

1
var parts = new List<string> { "part1", "part2", "part3" }; 
var quantities = new Dictionary<string, int> { { "part1", 45 }, { "part3", 25 } }; 

     var result = string.Join("|", 
       from p in parts select quantities.ContainsKey(p) 
         ? quantities[p].ToString() : ""); 
+0

Да, я был слишком импозантен. –

+0

Я отметил это как ответ, потому что он точно дал результат, который я искал, но @BrokenGlass сообщила мне, что я как-то переусердствовал. –

3

Что-то вроде этого, возможно?

var partValues = parts.Select(x => quantities.ContainsKey(x) ? quantities[x] : 0); 

В основном, для каждого элемента в части список вы либо выбрать значение из словаря, или если он не существует 0.

Чтобы сделать это немного более интересной, вы могли бы определить общее расширение Способ по IDictionary<T,U>, что делает это немного более читаемым:

public static class DictionaryExtensions 
{ 
    public static U GetValueOrDefault<T,U>(this IDictionary<T, U> dict, T key) 
    { 
     if(dict.ContainsKey(key)) 
     { 
      return dict[key]; 
     } 
     return default(U); 
    } 
} 

Тогда вы можете просто написать:

var partValues = parts.Select(quantities.GetValueOrDefault); 
+0

Duh. Конечно. Я переусердствовал. : P –