我试图避免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());
}
}
答案 0 :(得分:0)
我认为您只是想使用一种简单的方法来执行此循环,所以我将使用foreach
而不是if
和for
。关于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();