2016-02-19 3 views
2
new List<string[]> list = new List<string[]>(); 

for (int i = 0; i < contentList.Count; i++) //contentList is a list which can have many rows of data... 
{ 
    string str1 = contentList[i].Quicklink; // Get data 1 
    string str2 = contentList[i].Title; // Get data 2 
    list.Add(new[] { str1, str2 }); 
} 

//SORT THE LIST based by `str2` 

for (int p = 0; p < list.Count; p++) 
{ 
    Label1.Text += str1 + " " + str2 "\r\n";; 
} 

Как отсортировать список на основе значения str2, а затем присвоить значение ключа пары на этикетку.Как сортировать двумерный массив строк и назначить его на этикетку

+0

'list.OrderBy (x => x [1])'? Но если вы только и всегда имеете два, то «List >» может иметь больше смысла. – crashmstr

ответ

5

Для этого у вас есть LINQ:

var sorted = list.OrderBy(item => item[1]); 

Тогда вы можете сделать:

foreach(var item in sorted) 
    Label1.Text += item[0] + " " + item[1] + "\r\n"; //forgot the "+" 
+0

Короткие и простые. Спасибо. – Si8

+0

Здесь применяется тот же комментарий: не добавляйте текст в текст в свойство 'Control.Text'. Каждая итерация отправит сообщение Windows! –

+0

... да, в реальной программе я бы использовал StreamBuilder, это просто исправление для примера пользователя. – Gusman

2

Делая предположение, что вы сделать не действительно нужно list для любых других целей, мы можем просто сделайте это в одном цикле, итерации по contentList в том порядке, в котором мы хотим (этот подход имеет преимущество более очевидного в том, как мы сортируем данные).

var sb = new StringBuilder(); 
foreach (var c in contentList.OrderBy(x => x.Title)) 
{ 
    sb.Append(String.Format("{0} {1}\r\n", c.QuickLink, c.Title)); 
} 
Label1.Text = sb.ToString(); 

Примечание: обновлена ​​StringBuilder реализации и только один присвоение Label1.Text.

+0

Я бы избегал многократно обновлять элемент пользовательского интерфейса вроде этого. –

+0

Ну, лучшим способом было бы использовать 'StringBuilder', а затем просто назначить' Label1.Text' после цикла, но это проще ввести, и он получит точку. – crashmstr

+0

OP может просто скопировать ваш код, так что лучше всего предупредить их не делать этого так. Посмотрите на [реализацию установщика для Control.Text] (http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,952c66876790b53a). –

1

Проще всего было бы использовать LINQ:

list.OrderBy(arr => arr[1]).ToList() 

К сожалению, не смог проверить это, как я отвечаю с моего мобильного телефона.

1

вы можете использовать sring.Concat и имеет одну перегрузку, которая принимает IEnumerable

var sorted = from l in list.OrderBy(item => item[1]) 
      select l[0]+" "+l[1]+"\r\n"; 

Label1.Text = string.Concat(sorted); 
1

Try

StringBuilder sb = new StringBuilder(); 
    foreach(var content in contentList.OrderBy(p=>p.Title)) { 
     sb.Append(content.Quicklink); 
     sb.Append(" "); 
     sb.Append(content.Title); 
     sb.Append(Environment.NewLine); 


    } 

    Label1.Text = sb.ToString(); 

Примечание: Строка Builder удобна из-за того, что строки являются неизменяемыми и небрежно с помощью оператора + оператор на строки создает новую строку каждый раз. String Builder предотвращает это.

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