Dot-Net

匿名類型集合?

  • December 19, 2019

我正在尋找創建由匿名類型組成的集合的最佳實踐。

有幾種方法 -這個執行緒上的這個和大多數答案都假設整個匿名集合可以在一個語句中建構。

由於匿名類型通常用於替換用於儲存臨時的類(如this SO answer中提出的),因此我想避免為匿名集合創建和使用類,正如這篇文章所建議的那樣。

就我而言,我正在迭代一個集合 - 對於集合中的每個項目,我想以匿名類型(充當元組)收集相關對象。我需要將這些匿名類型放入一個集合中,然後對它們進行排序以供進一步工作。

我考慮過的其他方法:

  1. 使用一個對象$$ $$或 ArrayList (失去匿名類型的好處)
  2. 為所需項目創建包裝類(消除對匿名類型的需求)

這是我的程式碼中唯一需要這樣一個集合的地方——最好的方法是什麼?

附加資訊:

我正在使用舊版 .Net 1.1 對象,因此我正在使用的集合是實現 IEnumerable 的強類型集合,因此大多數 Linq 擴展方法(例如 .Select)都不起作用:

程式碼範例

foreach (Item item in myItems)
{
   foreach (Confirmation confirmation in item.GetConfirmations(true))
   {
       if (lastParentId != item.ParentId)
       {
           lastParentId = item.ParentId;
           parentObject = new ParentItem(lastParentId);
       }

       itemHolder = new ArrayList { item, confirmation };
       if (parentObject!= null)
       {
           itemHolder.Add(parentObject.Rate);
       }

       sortConfirmations.Add(confirmation.Date, itemHolder);
   }
}

// Use sortConfirmations

解析度

我最終使用通用字典將相關項目收集在一起並使用 .OrderBy() 對它們進行排序 - 醜陋,但它有效……並且比現有程式碼更好。

對於一個非常不同的答案…… LINQ?

就我而言,我正在迭代一個集合 - 對於集合中的每個項目,我想以匿名類型(充當元組)收集相關對象。我需要將這些匿名類型放入一個集合中,然後對它們進行排序以供進一步工作。

這聽起來像:

var list = (from item in collection
         from related in item.Relationship
         order by ...something...
         select new {item,related}).ToList()

如果您對數組感到滿意,則可以使用數組初始化程序:

var items = new[] {
   new { Foo = "def" },
   new { Foo = "ghi" },
   new { Foo = "jkl" }
};

ToList()如果你想List<T>出去,你可以打電話。ToList()由於不需要額外的複制,Marc 的解決方案將比呼叫更有效,但我認為在大多數情況下我可能會使用“array and then ToList()”解決方案,因為這樣會減少混亂。當然,如果性能對於那段程式碼至關重要,它會改變一些事情。

編輯:當您迭代集合時,只需使用Select

var anonymousItems = items.Select (item => new { Foo=item.Foo, 
                                                Bar=item.Other })
                         .ToList();

引用自:https://stackoverflow.com/questions/661663