2013-11-30 2 views
0

У меня есть список, который содержит объекты типа Field т.е. List<Field> и мой класс поля определяется следующим образом:Append строка в списке <String> содержится в словаре, используя LINQ

Public Class Field 
{ 
    public string FieldName { get; set; } 
    public string FieldValue { get; set; } 
} 

Этот список затем превращен в словарь тип Dictionary<string, List<string>>

Dictionary<string, List<string>> myResult = 
     myFieldList.Select(m => m) 
     .Select((c, i) => new { Key = c.FieldName, value = c.FieldValue }) 
     .GroupBy(o => o.Key, o => o.value) 
     .ToDictionary(grp => grp.Key, grp => grp.ToList()); 

Я хотел бы использовать Linq для добавления значения строк, содержащихся в списке в виде одной строки, так что технически словарь определен выше должен быть определен как Dictionary<string, string> но Мне нужно несколько дополнительных шагов при добавлении.

Мне нужно добавить \r\n перед каждыми значениями, добавленными и мне нужно, чтобы убедиться, что эти значения, включая новую линию не получить добавляются, если значение пусто, т.е.

value += (string.IsNullOrEmpty(newval) ? string.Empty : '\r\n' + newVal); 

Спасибо.

Т.

+0

а что вы пробовали до сих пор? –

+0

Я пробовал использовать Aggregate, но я просто не могу правильно его использовать. Я либо имею доступ к списку, либо к строке, но в любом случае, я не уверен, где разместить его в моем запросе linq. – Thierry

ответ

2

Может быть, это то, что вы хотите:

var myResult = myFieldList.GroupBy(o => o.FieldName, o => o.FieldValue) 
    .ToDictionary(grp => grp.Key, grp => string.Join("\r\n", 
             grp.Where(x=>!string.IsNullOrEmpty(x)))); 
+1

Это отлично поработало! Благодарю. – Thierry

1

Заменить grp.ToList() с логикой, которая принимает последовательность строк и помещает его вместе так, как вы хотите.

Ключевыми методами, которые вам нужны, являются .Where, чтобы игнорировать элементы (например, нули) и string.Join, чтобы объединить строки вместе с пользовательским столяром (т.е.

Кстати, вы должны использовать Environment.NewLine вместо '\r\n', чтобы ваш код был более портативным.

+0

Забавно, что вы должны упомянуть, что i.e. Environment.NewLine ... Здесь я удаляю его, думая, что это способ новичка кодировать, но я всегда использую это! :) и спасибо за рекомендацию. Вы были на месте, как и король Кинг! – Thierry

1

Вместо grp.ToList() в селекторе элементов из ToDictionnary, агрегат все в одной строке там (только это сделать, если у вас есть разумное количество строки в там, не очень высокий, так как он убил бы производительность) // Заменить этот grp.ToList()

// With this 
grp 
    .Where(s=>!string.IsNullOrEmtpy(s)) // drop the empty lines 
    .Aggregate((a,b)=>a+'\r\n'+b) // Aggregate all elements to a single string, adding your separator between each 
+0

Это * значительно * менее эффективно по сравнению с 'string.Join'. Квадратичный, а не линейный. –

+0

Да, я знаю, но действительно неактуальен в большинстве сценариев (часто вы собираете подвести итоги по 3-4 строки), поэтому я упомянул не использовать это, если вы работаете с большими коллекциями. Я использую это из habbit действительно, поскольку я использую совокупное множество вне строк и со строками, где объединение недостаточно гибко, но в этом случае решение соединения лучше точно. –

Смежные вопросы