将for循环转换为LINQ

时间:2018-12-09 22:39:02

标签: c# linq autocomplete

我试图避免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());
            }
        }

2 个答案:

答案 0 :(得分:0)

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

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

请记住-Linq并不是要从代码中删除控制流(循环)-循环仍然存在。 Linq与表达式有关,表达式可以包含循环或控制流。 (我知道,这很微妙)。

底线-如果需要循环,则需要循环。 Linq不会“删除”该需求。

答案 1 :(得分:0)

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

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();