C#建立物件列表(List)的不同方法

2017-12-18    分類:.NET開發、程式設計開發、首頁精華0人評論發表於2017-12-18

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

玩轉C#可有趣了。在這篇文章中,我們將介紹如何用不同的方法建立物件列表。因此,場景是這樣的,有一個MVC應用程式,我需要將5個空行(5個物件列表)繫結到grid表格,以便批量插入記錄。所以無論何時我開啟那個頁面,grid在可編輯模式下呈現5個空行。

在這篇文章中,為了更好的說明,我使用了“Book”的例子。舉個例子,假如我想新增多本書到一個圖書館管理軟體。首先,讓我們建立一個基本的POCO類——Book——它有一些屬性,看起來就像這樣:

public class Book
{
   public string BookName { get; set; } = string.Empty;
   public string Author { get; set; } = string.Empty;
   public string ISBN { get; set; } = string.Empty;
}

好的,讓我們從基本語法到高階語法開始探索吧。在C#3.0之前,要新增物件並初始化集合,我們經常是這樣做的:

var bookList = new List<Book>();
// Intiazize the object and add it to the collection
var book1 = new Book();
bookList.Add(book1);
var book2 = new Book();
bookList.Add(book2);

另一種方法是使用“for迴圈”,如下所示:

var bookList = new List<Book>();
// Another one is using for loop
for(int i = 0; i < 2; i++)
{
     bookList.Add(new Book());
}

另一種方法是使用AddRange()方法,它將物件新增到指定的集合中。

var bookList = new List<Book>();
// Using AddRange method.
bookList.AddRange(new[] {
                    new Book(),
                    new Book()
});

C#3.0帶來了很多增強功能。其中之一就是Collection Initializers。這是一個用於建立集合的縮短語法。

// using collection initializer
var bookList = new List<Book>()
{
  new Book(),
  new Book(),
  new Book()
};

在.NET框架中,有一個類——Enumerable——居於“System.Linq”名稱空間下。這個類包含一些靜態方法,我們可以使用這些靜態方法建立物件列表。例如,使用Enumerable.Repeat()方法:

// using Enumerable.Repeat
var bookList = Enumerable.Repeat(new Book(), 2).ToList();

在上面的方法中,第一個引數是我們想要建立或重複的物件。第二個引數是我們需要重複物件的次數。

使用Enumerable.Range()方法的另一個示例:

// and another one is Enumerable.Repeat
var bookList = Enumerable.Range(1, 2).Select(i => new Book()).ToList();

Range()方法會在指定範圍內生成一個集合。請注意,這種方法有很多很多用例。

好吧,但我想在另一個應用程式中使用它,所以我決定做一個擴充套件方法,並使得該擴充套件方法可以通用。所以,在這裡,我建立了兩個擴充套件方法。第一個將新增“N”個物件到列表中。第二個將返回“N”個物件的集合。

public static class UtilityExt
{
  ///<summary>
  /// Add "N" number of objects to the source list.
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="emptySource"></param>
  /// <param name="number">Number of elements to add</param>
  public static void AddNObjectsToCollection<T>(this List<T> emptySource, int number) 
    where T : new()
  {
      emptySource.AddRange(Enumerable.Repeat(new T(), number));
  }
  ///<summary>
  /// Returns the collection which contains "N" numbers of elements of type T
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="emptySource"></param>
  /// <param name="number">Number of elements to return</param>
  /// <returns></returns>
  public static IList<T> GenerateSpecificNumberOfCollection<T>(this IEnumerable<T> emptySource, int number) 
    where T : new()
  {
      return Enumerable.Repeat(new T(), number).ToList();
  }
}

你可以像這樣呼叫上面的方法:

// Calling first method - AddNObjectsToCollection
var bookList = new List<Book>();
bookList.AddNObjectsToCollection(2);
// ========== OR ==========
// Calling second method - GenerateSpecificNumberOfCollection
var bookList = new List<Book>().GenerateSpecificNumberOfCollection(3);

好的,上面提到的所有語法都會影響程式碼的可讀性和可重複性。如果你有任何其他可以實現相同結果的方法,歡迎隨時分享到評論部分。最後,希望你喜歡這篇文章。

譯文連結:http://www.codeceo.com/article/csharp-create-list.html
英文原文:Different Ways of Creating a List of Objects in C#
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章