【问题标题】:Convert for loop to LINQ将 for 循环转换为 LINQ
【发布时间】:2019-05-10 20:44:42
【问题描述】:

我试图避免 for 循环并使用 LINQ 而不是 for 循环。任何帮助将不胜感激。我一直在尝试使用 dt.select (a=>...) 但它总是抛出错误“无法将 lambda 表达式转换为类型字符串,因为它不是委托类型”。

    AutoCompleteStringCollection coll = new AutoCompleteStringCollection();  
    cn = new SqlConnection("Data Source=.;Initial Catalog=XYX;Integrated 
    Security=True");
    da = new SqlDataAdapter("select UserName from ServiceProviders order 
    by UserName asc", cn);
    DataTable dt = new DataTable();
    da.Fill(dt);
    if (dt.Rows.Count > 0)
      {
         for (int i = 0; i < dt.Rows.Count; i++)
            {
             coll.Add(dt.Rows[i]["UserName"].ToString());
            }
        }

【问题讨论】:

  • 所以你想遍历每一行并将用户名字段添加到 coll 集合中?你想在没有循环的情况下做一个循环吗?
  • 我想这是你需要的小费stackoverflow.com/questions/4974159/…
  • LINQ 只有在 coll 的类型为 List 时才有意义,因为它的 AddRange 方法采用 IEnumerable,这是 LINQ 的基本数据结构。在这种情况下,您的循环(以及周围的 if 块)可以替换为 coll.AddRange(dt.Rows.Select(row =&gt; row["UserName"].ToString()));。但正如霍根所说,在他的解决方案中也会发生同样的情况。
  • 得到错误,dt,rows 不包含 Select 的定义。

标签: c# linq autocomplete


【解决方案1】:

我认为您只是想要一种简单的方法来执行此循环,我会使用 foreach 而不是 iffor。 foreach 的好处是您不必检查计数。如果没有,则不会执行。代码应如下所示:

foreach( var row in dt.Rows)
{
   coll.Add(row["Username"].ToString());
}

记住这一点——Linq 并不是要从你的代码中删除控制流(循环)——循环仍然存在。 Linq 是关于可以包含循环或控制流的表达式和表达式。 (我知道,这很微妙)。

底线——如果你需要一个循环,你就需要一个循环。 Linq 不会“消除”这种需求。

【讨论】:

  • 谢谢!得到一个错误。无法使用 [] 应用索引。
  • @Gaurav -- 我可以看到你的确切代码吗?在调试行的循环中应该是 DataRow 类型,如果不是,那么你有一个错字。
【解决方案2】:

要对DataTable 进行linq 查询,您需要先调用.AsEnumerable()。我注意到您的coll 不是List&lt;string&gt;,但您正在将您的选择添加为string,您可能想调查一下,但要回答您的具体问题,这里是一个查询的基本示例DataTable 并将特定行添加到 List&lt;T&gt;

var dt = new DataTable();
dt.Columns.Add("UserName");
dt.Columns.Add("Bar");
dt.Rows.Add("Bob", 1);
dt.Rows.Add("Bill", 2);
dt.Rows.Add("John", 3);

var foo = dt.AsEnumerable().Select(r => r["UserName"]).ToList();
var bar = dt.AsEnumerable().Select(r => r["Bar"]).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2015-12-03
    • 2021-03-12
    • 2018-02-22
    • 2017-04-26
    相关资源
    最近更新 更多