2017-01-09 6 views
1

Строка, содержащая дату и целое число в определенном формате: ММ/дд/гггг (номер)Сортировка данных в пределах значения строки

string strData = "01/23/2017 (5); 01/16/2017 (2);01/24/2017 (6);01/16/2017 (5);01/23/2017 (10)"; 

На основании выше, я хочу следующее:

  1. Добавить Номер, если дата аналогична
  2. Сортировка должна быть основана на дате, т.е. по возрастанию

Ожидаемый результат:

strData = "01/16/2017 (7);01/23/2017 (15);01/24/2017 (6)";  

Я знаю, что это возможно, если мы разделимся на основе точкой с запятой, а затем траверс значения с помощью "для цикла.

Но, пожалуйста, предложите мне решение linq.

+1

А также с Linq Я уверен, что вам нужно разделить на точку с запятой, чтобы сделать какой-либо смысл из этой строки – Steve

+0

Можете ли вы дать образцы данных для точки № 1? –

+0

Что вы подразумеваете под номером? – derloopkat

ответ

5

Это должно работать:

var elems = strData.Split(';') // First, split on semicolon 
    .Select(s => s.Trim().Split(' ')) // then remove the extra space at the end of each element, and split again on the space 
    .Select(s => new { d = DateTime.ParseExact(s[0], "MM/dd/yyyy", CultureInfo.InvariantCulture), n = int.Parse(s[1].Replace("(", "").Replace(")", "")) }) // here, we create a temp object containing the parsed date and the value 
    .GroupBy(o => o.d) // group by date 
    .OrderBy(g => g.Key) // then sort 
    .Select(g => $"{g.Key:MM'/'dd'/'yyyy} ({g.Sum(a => a.n)})"); // and finally build the resulting string 

Вы можете построить конечную строку с:

string.Join(";", elems); 

Этот ответ использует C# 6 интерполированные строки. При использовании более старую версию языка, замените $"{g.Key:MM'/'dd'/'yyyy} ({g.Sum(a => a.n)})" на string.Format("{0:MM'/'dd'/'yyyy} ({1})", g.Key, g.Sum(a => a.n))

2

Вот другой подход

string strData = "01/23/2017 (5); 01/16/2017 (2);01/24/2017 (6);01/16/2017 (5);01/23/2017 (10)"; 
string result = string.Join(";", strData.Split(';') 
      .Select(x => new { 
       Date = DateTime.ParseExact(x.Trim().Split()[0], "MM/dd/yyyy", CultureInfo.InvariantCulture), 
       Count = int.Parse(x.Trim().Split()[1].Trim('(', ')')) }) 
      .GroupBy(x => x.Date) 
      .OrderBy(x => x.Key) 
      .Select(x => x.Key.ToString("MM/dd/yyyy") + " (" + x.Sum(y => y.Count) + ")"));