【问题标题】:What is the correct way to call the .ToString() method on each item in a list?对列表中的每个项目调用 .ToString() 方法的正确方法是什么?
【发布时间】:2014-09-28 08:48:54
【问题描述】:

我有一个实现 .ToString() 方法的对象列表。我期待为列表中的每个项目找到一个非常容易调用的 .ToString() 方法,并获得一个字符串列表。

这是在 foreach 中执行此操作的一种方法。

List<string> entityNames = new List<string>();
foreach (Entity parent in parents)
{
    entityNames.Add(parent.ToString());
}

这是我想出的最好的方法,有没有更好的方法?

IList<string> entityNames2 = (from parent in parents where true select user.ToString()).ToList();

【问题讨论】:

  • 旁注:没有描述“更好”对您意味着什么的“最好”通常是不好问题的标志。根据接受的答案,您正在寻找“越短越好”的解决方案 - 请参阅我对接受的答案的评论以从中获得更多信息。

标签: c# list-comprehension


【解决方案1】:

List 有一个 ConvertAll() 方法,可以完全满足您的需求。

要从现有列表生成新列表,您可以这样做

List<string> entityNames = parents.ConvertAll(p => p.ToString());

注意parents 必须是一个列表才能工作,该方法没有为 IEnumerables 定义。

对于 IEnumerables,您也​​可以使用普通的 select(),然后调用 ToList()

parents.Select(p=>p.ToString()).ToList();

(这相当于您在查询语法中提出的那一行,但使用linq method syntax

这比ConvertAll() 效率低一点,在第一种情况下,分配一次正确大小的新列表,在第二种情况下,事先不知道正确大小,因此新列表需要动态增长。在大多数情况下,这种差异很可能是微不足道的,第二种方法适用于所有 IEnumerable,而不仅仅是列表

【讨论】:

  • +1。由于 OP 可能会寻找最好的尺寸,您可以从 Select 中删除 p=&gt;p. 部分:.Select(ToString) 将缩短 5 个字符。
  • @Alexei,我认为这行不通:虽然你可以只传递一个具有正确签名的方法来选择,而不是通过 lambda 语法构造一个新方法,在这种情况下,如果你调用x.Select(ToString) 编译器会尝试使用当前方法的类的 ToString(),而不是 x 中元素的 ToString(),并且两者都有错误的签名(不是 Func
  • HugoRune,确实你是对的......实际上它甚至无法编译 - 不知道我在想什么。 Convert.ToString 可以,但要多 3 个字符:parents.Select(Convert.ToString).ToList()
【解决方案2】:

想到了两种方法:

entityNames = parents.Select(p => p.ToString()).ToList();

entityNames = parents.Cast<string>().ToList();

This SO questionthis one 有更多关于 Select()Cast() 方法之间区别的信息。

Enumerable.Select - MSDNEnumerable.Cast Method - MSDN 了解更多信息。

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多