2013-08-21 42 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,没有得到说明考虑。 –