c# - 如何查询数据表
问题描述
我有一个这样的数据表:
column1 column2 column3
a b c
d e f
我想获取单元格“e”的索引号,我写了这些
int[] indexrowcol = new int[2];
for (int i = 0; i < dt.Columns.Count ; i++)
{
for (int j = 0; j < dt.Rows.Count; j++)
{
if (dt.Rows[i][j] == "e")
{
indexrowcol[0] = j; indexrowcol[1] = i;
}
}
}
如何使用 LINQ 编写相同的内容?谢谢。
解决方案
我不相信你有正确实现你的原始代码来获得你想要的东西。但至少它或多或少清楚你想要做什么。这是一些可以完成它的注释链接代码。
var valToSearch = "e";
int[] indexrowcol = dt.AsEnumerable() // allows you to use linq
.SelectMany((row,rix) => // like 'Select', but stacks up listed output
row.ItemArray.Select( // ItemArray gets the row as an array
(col,cix) => new { rix, cix, value = col.ToString() }
)
)
.Where(obj => obj.value == valToSearch)
.Select(obj => new int[] { obj.rix, obj.cix })
.FirstOrDefault();
当我在以下 DataTable 上使用上述代码时,我得到了结果[1,1]
,这与我在纠正撰写本文时存在的 i/j 反转时使用原始代码得到的结果相同。
var dt = new DataTable();
dt.Columns.Add("Column1");
dt.Columns.Add("Column2");
dt.Columns.Add("Column3");
DataRow rw = dt.NewRow();
rw["Column1"] = "a";
rw["Column2"] = "b";
rw["Column3"] = "c";
dt.Rows.Add(rw);
rw = dt.NewRow();
rw["Column1"] = "d";
rw["Column2"] = "e";
rw["Column3"] = "f";
dt.Rows.Add(rw);
您的原始代码不太正确的原因是您使用 'i' 表示列,使用 'j' 表示行,然后调用dt.Rows[i][j]
,这是倒退的。我强烈建议您的变量可以与它们关联的内容相匹配。这就是为什么我使用诸如col
, row
, cix
(列索引)之类的名称,并rix
保持直截了当。
在这种情况下,您可能还想输出除 int[2] 以外的其他内容。也许是一个类或结构,或者甚至只是将它作为一个匿名对象(摆脱我的查询的“选择”部分)。虽然我不知道你的最终用例,所以我会让你一个人呆着。
推荐阅读
- react-native - React Native SearchBar Invariant Violation 错误'预期的功能,而不是对象的值'
- c# - 从 API 获取 json 对象,使用 C# 修改并发布它
- firebase - 如何解决〜在 null 上调用了 getter 'documentID'。〜?
- angular - Angular 6 与 Angular Material、sweetalert 和 webpack
- android - Firebase 之外的推送通知和电话身份验证服务
- amazon-web-services - Terraform for_each 变量以创建多个 AWS 侦听器规则并设置唯一的 target_group_arn
- python - 如何在python的循环中定义缩进
- powershell - 如何在 powershell 命令行中使用 FTP 将文件上传到 OneDrive
- c# - 从 Azure 服务总线主题读取的 Asp.net Core 2.2
- javascript - 在javascript中修改颜色