在 C# 中使用 Linq 选择 DataRow

发布于 2024-12-09 12:01:02 字数 811 浏览 0 评论 0原文

如何使用 Linq 将其缩短?

int id = 0;
foreach (DataRow dr in tableClientTableAdapter1.GetData())
{
     if (dr[0].ToString() == txtClientName.Text)
      {
          id = Convert.ToInt16(dr[1]);
          break;
      }
}

我尝试使用这个

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(cName => cName[0].ToString() == txtClientName.Text);
MessageBox.Show(a[1].ToString());

但我得到了这个错误:

错误 1 ​​无法将 [] 索引应用于“System.Data.EnumerableRowCollection”类型的表达式 C:\Users\[电子邮件受保护]\Desktop[Final][GlobalTek] 监控系统[GlobalTek] 监控系统\xfrmProjectAwarding.cs 89 37 [GlobalTek] 监控系统

任何帮助!

How can I make this to shorter one using Linq?

int id = 0;
foreach (DataRow dr in tableClientTableAdapter1.GetData())
{
     if (dr[0].ToString() == txtClientName.Text)
      {
          id = Convert.ToInt16(dr[1]);
          break;
      }
}

I tried using this

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(cName => cName[0].ToString() == txtClientName.Text);
MessageBox.Show(a[1].ToString());

But I got this error:

Error 1 Cannot apply indexing with [] to an expression of type 'System.Data.EnumerableRowCollection' C:\Users\[email protected]\Desktop[Final][GlobalTek] Monitoring System[GlobalTek] Monitoring System\xfrmProjectAwarding.cs 89 37 [GlobalTek] Monitoring System

Any help!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

孤君无依 2024-12-16 12:01:03

var a = 是您尝试将其视为单个对象的 DataRow 项目的序列。如果您需要一种结果,请在查询中使用其中之一

.First()
.FirstOrDefault()
.Single()
.SingleOrDefault()

,其区别在于您对结果的期望。如果可以存在多个项目,但您只对其中第一个感兴趣,请使用 First()。如果只有一项应该匹配,而如果有更多则出现错误,请使用Single()。如果在任何一种情况下都可能没有匹配,请使用适当的*OrDefault()版本。

var row = tableClientTableAdapter1.GetData().
               Cast<DataRow>()
               .Where(cName => cName[0].ToString() == txtClientName.Text)
               .FirstOrDefault(); 

if (row != null)
{
     // extract value
}

var a = is a sequence of DataRow items that you are trying to treat as a single object. If you desire one result, use one of

.First()
.FirstOrDefault()
.Single()
.SingleOrDefault()

on the query, with the difference being your expectation for the result. If more than one item can be present but you're only interested in the first of them, go with First(). If only one item should match and it's an error if there are more, go with Single(). If, in either scenario, it's possible for there to be no matches, use the appropriate *OrDefault() version.

var row = tableClientTableAdapter1.GetData().
               Cast<DataRow>()
               .Where(cName => cName[0].ToString() == txtClientName.Text)
               .FirstOrDefault(); 

if (row != null)
{
     // extract value
}
九八野马 2024-12-16 12:01:03

试试这个:

var a = Convert.ToInt16(tableClientTableAdapter1.GetData().Cast<DataRow>().First(r => r[0].ToString() == txtClientName.Text)[1]);

但请注意,如果没有匹配,它会抛出异常。如果有可能,您应该这样做:

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().FirstOrDefault(r => r[0].ToString() == txtClientName.Text);
var b = (a != null)?Convert.ToInt16(a[1]):0;

Try this:

var a = Convert.ToInt16(tableClientTableAdapter1.GetData().Cast<DataRow>().First(r => r[0].ToString() == txtClientName.Text)[1]);

But be warned it will throw an exception if there is no match. If that's a possibility, you should do this:

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().FirstOrDefault(r => r[0].ToString() == txtClientName.Text);
var b = (a != null)?Convert.ToInt16(a[1]):0;
财迷小姐 2024-12-16 12:01:03

如果要使用强制转换方法,您还应该使用字段方法。

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(t => t.Field<string>(0) == txtClientName.Text).ToList();

如果您想通过索引访问,则添加 ToList()

如果您只需要第一个匹配项,您可以根据您希望如何处理 null 来将 where 替换为 First/FirstOrDefault

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().First(t => t.Field<string>(0) == txtClientName.Text);

If you are going to use the cast method you should also use the field method.

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(t => t.Field<string>(0) == txtClientName.Text).ToList();

ToList() added if you want to access via index

If you only need the first match you can replace where with First/FirstOrDefault depending on how you want null handled

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().First(t => t.Field<string>(0) == txtClientName.Text);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文