【问题标题】:How do I write this loop as a single line?如何将这个循环写成一行?
【发布时间】:2012-11-09 20:06:41
【问题描述】:

我不知道这是否可能,但让我问你。如何使用例如 LINQ 以更短的方式编写以下循环?

DataSet dsAllMonsters 
List<string> lstAllMonsters

for (int i = 0; i < dsAllMonsters.Tables[0].Rows.Count; i++)
{
    lstAllMonsters.Add(dsAllMonsters.Tables[0].Rows[i]["pokemonId"].ToString());
}

【问题讨论】:

  • 是的,可以缩短。这能回答你的问题吗?
  • 请不要暗示问题。 =)
  • 您的工作场所是否缺少换行符? :-) 您可能会丢失大括号,甚至可以将foradd 放在一行中,但我需要问为什么。像这样的简短 for 声明本质上没有什么不可读的。
  • @paxdiablo 事情是关于以最有效的方式编写代码。我在这里展示的方式是我一直在使用的蹩脚方式:D

标签: c# linq c#-4.0 for-loop dataset


【解决方案1】:

我认为可以。

lstAllMonsters = dsAllMonsters.Tables[0].Rows
   .Cast<DataRow>()
   .Select(r => r["pokemonId"].ToString())
   .ToList();

【讨论】:

    【解决方案2】:

    是的,可以一行完成:

    lstAllMonsters = dsAllMonsters.Tables[0].Rows.Cast<DataRow>().Select(row => row["pokemonId"].ToString()).ToList();
    

    但有时两条线比一条线好。我想你会发现这更具可读性:

    var rows = dsAllMonsters.Tables[0].Rows.Cast<DataRow>();
    lstAllMonsters = rows.Select(row => row["pokemonId"].ToString()).ToList();
    

    【讨论】:

    • 我认为你必须强制转换行项,否则 linq 运算符不会亮起。
    • 任何不是通用的,只有少数 linq 操作可以处理它。
    • 这个 linQ 太棒了。我真的需要掌握它谢谢你:)
    • 这不起作用:“System.Data.DataRowCollection”不包含“Select”的定义,并且没有扩展方法“Select”接受“System.Data.DataRowCollection”类型的第一个参数可以找到(您是否缺少 using 指令或程序集引用?)
    • @KarelFrajtak:你看到我在Cast添加调用的更新了吗?
    【解决方案3】:

    在一行中实现它的另一种方法。

    dsAllMonsters.Tables[0].AsEnumerable().ToList().ForEach((DataRow a) => lstAllMonsters.Add(a["pokemonId"].ToString()));
    

    【讨论】:

    • 多次枚举。
    猜你喜欢
    • 2020-06-12
    • 2022-11-19
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多