在List<T>中获取变量的List<string>

6

我目前有一个由以下类组成的List<T>:


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

我想创建一个List<string>,其中只包含List中所有标题。
哪种方法性能最佳? 编辑 我的描述字段平均为2k个字符...我不希望它仅获取标题变慢。 编辑2 我正在使用MVC的Code First(Entity Framework)。 List<T>存储在_context中,我从中查询数据。 编辑3 如果可能的话..有没有一种方法可以获取标题和ID?

1
你认为为什么description属性会减慢获取标题的速度?列表已经初始化了吗?你总是在一个方法中加载它吗?如果你经常需要它,也许你可以使用一个字段。顺便说一下:你应该遵循.NET命名约定。因此,属性应该使用帕斯卡命名法。 - Tim Schmelter
我已经更新了我的问题。当我在foreach循环中调用_context,然后将结果添加到一个新的List<T>中返回时,需要大约2秒钟才能得到2个结果。 - TheGeekZn
3个回答

15

我想创建一个只包含 List 中所有标题的 List<string>

您可以通过 Select 进行投影。

var list = new List<SomeClass>();

var titleList = list.Select(x => x.title).ToList();

请参阅C#中使用LINQ扩展方法入门获取更多关于LINQ扩展方法的信息。

如果可能... 是否有一种方法可以获取标题和ID?

您可以使用匿名类型将这三个属性放在一个列表中:

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语句更快,但这是一项你应该通过基准测试来权衡的选择,因为在大多数情况下差别可以忽略不计。

微基准测试


2
如果提问者不熟悉 LINQ 的不同扩展方法,它会解释这些方法。如果您知道更好的链接,我可以进行更换。 - Dustin Kingen
使用foreach循环花费了我约4秒钟来获取结果。使用.Select()方法将其降低到大约0.7秒钟左右。 - TheGeekZn
@Romoku:这很令人困惑,因为它暗示了性能问题与您使用LINQ的方式有关。如果您只想添加教程链接,那么这可能更好,因为它更通用:在C#中开始使用LINQ - Tim Schmelter
感谢@Romoku的更新->不过,是否有类似于我帖子中的Edit3的解决方案? - TheGeekZn
在同一个列表中包含所有三个属性,还是每个属性单独成为一个列表? - Dustin Kingen
显示剩余2条评论

8

看起来你正在使用Entity Framework,如果是这样的话,你不需要从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是一个匿名类型,包括属性titleid

+1 确实如此。我正在使用 EF,尽管其他答案的变体确实解决了这个谜题。不过,我已经更新了我的问题,加入了另一个因素。 - TheGeekZn
但仅涉及Edit2,不考虑描述。 - Tomer W
1
如果您想获取ID,可以通过 _context.MyTable.Select(x => new{Title=x.title, Id=x.id}).ToList(); 创建匿名类型。 - Tomer W
@ErenErsönmez 收到了!Dictionary<int,string> returnList = _context.Articles.Select(o => new { ID = o.ID, Title = o.Title }).ToDictionary(x => x.ID, x => x.Title); - TheGeekZn

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接