2016-09-20 5 views
0

私のアプリにはオブジェクトの配列があります。各オブジェクトには、URL付きのListが含まれています。私はそのためにLists項目を表示したい:項目を取得するためにAccountクラス内部オブジェクトを注文する

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

、公共方法:

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ループを使用しています

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

それしかし、私はこれを行うよりエレガントな方法かもしれないと思う。あなたは何か考えていますか?

+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

2人が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を使用できるようになります。

関連する問題