2016-09-20 4 views
0

В моем приложении у меня есть массив объектов. Каждый объект содержит List с URL-адресами. Я хочу, чтобы отобразить Lists элемент в таком порядке:Заказ объектов Элементы списка

First item from first objects list 
First item from second objects list 
First item from third objects list 
Second item from first objects list 
.. 
etc 

Сейчас я использую foreach цикл:

  foreach (Account acc in account) 
      { 
        listBox1.Items.Add(acc.ShowData()) 
      } 

И открытый метод внутри Account класс, чтобы получить пункты:

public string ShowData() 
{   
     string singleItem = LinksArray.First(); 
     LinksArray.RemoveAt(0); 
     return singleItem;    
} 

It работает, но я думаю, что может быть более элегантный способ сделать это. Есть ли у вас какие-либо идеи?

+0

Вероятно, лучше подходит для http://codereview.stackexchange.com/ – Knetic

ответ

2

Попробуйте уплощение все в набор пар индекс/URL, то порядка по индексу:

var orderedUrls = objects 
    .SelectMany(o => o.Urls.Select((url, idx) => new { Index = idx, Url = url })) 
    .OrderBy(indexedUrl => indexedUrl.Index) 
    .Select(indexedUrl => indexedUrl.Url) 
+0

Должно быть хорошим решением, если два человека придумают его в течение 30 секунд друг от друга. Мне больше нравится ваше соглашение об именах, и использование 'SelectMany' немного чище, чем' Select'/'Concat'. – Enigmativity

0

Это работает для меня:

List<Uri>[] arrayOfListsOfUris = ... 

IEnumerable<Uri> sorted = 
    arrayOfListsOfUris 
     .Select(xs => xs.Select((x, n) => new { x, n })) 
     .Concat() 
     .OrderBy(y => y.n) 
     .Select(y => y.x); 

foreach (Uri uri in sorted) 
{ 
    //Do something with each Uri 
} 
0

Способ по имени ShowData никогда не должны изменять данные, которые он показывает. Вместо этого вам может быть лучше подан что-то вроде этого;

public IEnumerable<String> GetData() 
{ 
    return LinksArray; 
} 

который вы можете использовать;

foreach(Account acc in accounts) 
{ 
    foreach(String data in acc.GetData()) 
    { 
     // add to listbox items 
    } 
} 

Это обеспечивает четкое разделение между вашими данными и способ их отображения и чтения пользователями этого класса. Он также, возможно, открывает вам доступ к LINQ.

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