【问题标题】:Get a List<string> of variables within a List<T>获取 List<T> 中变量的 List<string>
【发布时间】:2013-08-23 21:00:41
【问题描述】:

我目前有一个List&lt;T&gt;,由以下班级组成:

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

我想创建一个List&lt;string&gt;,其中只有所有列表中的标题

执行此操作的最佳性能方式是什么?

编辑 我的描述字段平均有 2k 个字符...我不希望这会减慢获取标题的速度。

编辑2 我首先使用 MVC 的代码(实体框架)。 List&lt;T&gt; 存储在 _context 中,我从中查询以获取数据。

Edit3 如果可能的话.. 有没有办法获得 Title AND ID ?

【问题讨论】:

  • 您为什么认为description 属性会减慢获得标题的速度?列表是否已经初始化?你总是在方法中加载它吗?如果您经常需要它,也许您可​​以使用一个字段。旁注:您应该关注.NET naming conventions。所以属性应该是pascal case
  • 我已经更新了我的问题。当我在 foreach 循环中调用 _context,然后将结果添加到新的 List 以返回时,2 个结果大约需要 2 秒。

标签: c# asp.net-mvc list ef-code-first


【解决方案1】:

我想创建一个 List&lt;string&gt; 仅包含列表中的所有标题

您可以通过Select使用投影。

var list = new List<SomeClass>();

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

有关 LINQ 扩展方法的更多信息,请参阅 Getting Started with LINQ in C#

如果可能的话 .. 有没有办法获得 Title AND 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

【讨论】:

  • 不过,我不确定您为什么要链接“LINQ 中的查询语法和方法语法”。
  • 如果OP不熟悉,它解释了linq的不同扩展方法。如果您知道更好的链接,我可以交换它。​​
  • 使用 foreach 循环花了我大约 4 秒的时间来获得结果。使用 .Select() 将其降低到约 0.7 秒。
  • @Romoku:这只是令人困惑,因为它表明性能问题与您使用 LINQ 的方式有关。如果您只是想添加一个教程链接,这可能会更好,因为它更通用:Getting Started with LINQ in C#
  • 感谢@Romoku 的更新 -> 但是,对于我的帖子的 Edit3 是否有这样的解决方案?
【解决方案2】:

听起来您正在使用实体框架,在这种情况下,您不会从 List&lt;T&gt; 创建 List&lt;string&gt; - 您将直接从您的 _context 查询 List&lt;string&gt;

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

是的,你可以把title和id放在一起:

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

这会给你一个List&lt;T&gt;,其中T 是一个匿名类型,包括属性titleid

【讨论】:

  • 确实是+1。我正在使用 EF,尽管其他答案变体确实解决了这个谜题。虽然,我已经更新了我的问题,加入了另一个齿轮。
  • 但只有这个参与 Edit2,没有考虑到描述。
  • 如果你也想获取ID,可以_context.MyTable.Select(x =&gt; new{Title=x.title, Id=x.id}).ToList();创建匿名类型
  • @ErenErsönmez 知道了! Dictionary&lt;int, string&gt; returnList = _context.Articles.Select(o =&gt; new { ID = o.ID, Title = o.Title }).ToDictionary(x =&gt; x.ID, x =&gt; x.Title);
【解决方案3】:
list.Select(o => o.title).ToList();

其中list 是您的泛型类型的List&lt;T&gt;

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2017-03-11
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多