2013-08-21 81 views
5

我公司目前擁有由以下類的List<T>獲取列表中的變量列表<string><T>

int id { get; set; } 
string title { get; set; } 
string description { get; set; } 

我想在列表中創建的唯一所有標題的一個List<string>

這將是最好的性能方式來做到這一點?

編輯 我描述場平均2K字......我不希望這樣的只有獲得冠軍放緩。

編輯2 我首先使用MVC的代碼(實體框架)。 List<T>存儲在_context中,我從中查詢以獲取數據。

Edit3如果可能..有沒有辦法獲得標題和ID?

+1

你爲什麼認爲'description'屬性可能會減慢獲取標題?列表是否已經初始化?你是否總是在一個方法中加載它?也許你可以使用一個字段,如果你經常需要的話。注意:你應該遵循[.NET命名約定](http://msdn.microsoft.com/en-us/library/ms229043.aspx)。所以屬性應該是[pascal case](http://msdn.microsoft.com/en-us/library/x2dbyw72(v = vs.71).aspx)。 –

+0

我已更新我的問題。當我在foreach循環中調用_context時,然後將結果添加到新列表以返回,2個結果大約需要2秒。 – TheGeekZn

回答

14

我想在列表

您可以通過Select使用投影創建的唯一的全標題的一個List<string>。請參閱Getting Started with LINQ in C#瞭解LINQ擴展方法的更多信息。

如果可能..有沒有辦法獲得標題和ID?

您可以使用Anonymous Type把所有三個屬性中的一個列表:

var entityList = list.Select(x => new { x.title, x.id, x.description }).ToList(); 

這將是表現最好的方式做到這一點?

var list = new List<SomeClass>(); 
var titleList = new List<string>(list.Count); 

foreach(var item in list) 
{ 
    titleList.Add(item.title); 
} 

LINQ不會超越簡單的foreach聲明,但這是你應該的標杆,因爲不同的是在多數情況下可以忽略不計評估的權衡。

Microbenchmark

+0

雖然我不確定爲什麼鏈接「查詢語法和LINQ中的方法語法」。 –

+2

它解釋瞭如果OP不熟悉它們,linq的不同擴展方法。如果你知道更好的鏈接,我可以交換它。 – Romoku

+0

使用foreach循環花了我~4秒來得到結果。使用.Select()將其降低到約0.7秒。 – TheGeekZn

4
list.Select(o => o.title).ToList(); 

其中list是您的泛型類型的List<T>

8

聽起來你正在使用實體框架,在這種情況下,你不會創建一個從List<T>List<string> - 你將直接從您的_context查詢List<string>

var titles = _context.MyTable.Select(x => x.title).ToList(); 

,是的,你可以拿到冠軍和ID一起:

var titleAndIds = _context.MyTable.Select(x => new{ x.title, x.id}).ToList(); 

這給你一個List<T>,其中T是包括性title和匿名類型。

+1

+1確實考慮實體框架 – Habib

+0

+1。我正在使用EF,但答案的其他變體確實解決了這個謎題。儘管如此,我已經更新了我的問題以投入另一個齒輪。 – TheGeekZn

+0

但只有這一個參與編輯2,沒有得到說明考慮。 –