解决 在数据表中搜索特定值

半人马座

会员
已加入
2017年12月17日
留言内容
12
地点
休斯顿
编程经验
3-5
我在下面的示例中创建了一个动态单位转换数据表,并希望基本上使用交点类型搜索来查找特定值。 gpm_us是参考单位,在此示例中,所有其他单位都基于该单位进行转换。例如,假设我要"Min"m3 / hr的换算值,这会给我 1.14。如前所述,数据表将是动态的,现在我需要能够根据需要从表中提取转换。在此先感谢您的帮助!

单位
规范
最高
gpm_us​
5​
15​
30​
升/分​
18.93​
56.78​
113.56​
立方米/小时​
1.14​
3.41​
6.81​
桶/天​
171.43​
514.29​
1028.57​
桶/小时​
7.14​
21.43​
42.86​
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
您是否要使用:


C#:
DataTable table = DataSet1.Tables["yourTable"];
DataRow[] rows = table.Select("m3/hr");

Console.WriteLine(rows["Min"]);

不确定这是正确的,只是以为我会对此采取狂妄的尝试。可能是您的起点。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
当然,那些知道自己实际在做什么的人会加入并为Linq指明道路-我希望这是实现此目标的正确方法...。

为了我自己的学习目的...

C#:
foreach (DataRow o in table.Select("Units = 'm3/hr'"))
            {
                  textBox1.Text = o[1].ToString();
            }

那应该带回1.14。

编辑该字符串以删除字符串引用,因为我尝试了其他事情,并且在那里放了它,但这实际上不是必需的。
 

半人马座

会员
已加入
2017年12月17日
留言内容
12
地点
休斯顿
编程经验
3-5
我最终以这种方式这样做。我确信这不是实现它的最佳方法,但这就是我现在所拥有的。如果有人可以向我展示一种更好的方法或LINQ方法,那么我将非常感谢。谢谢!!

C#:
for (int row = 0; row < dt.Rows.Count; row++)
{
    if (dt.Rows[row][0].ToString() == user_selected_unit)
    {
        double min_val = Convert.ToDouble(dt.Rows[row][1].ToString());
        double norm_val = Convert.ToDouble(dt.Rows[row][2].ToString());
        double max_val = Convert.ToDouble(dt.Rows[row][3].ToString());
        break;
    }
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,499
地点
悉尼,澳大利亚
编程经验
10+
There's no need to use LINQ. You've already got everything you need. Select returns a DataRow array and you can then get the first element from that array, if it exists.
C#:
var matchingRows = dt.Select($"Units = '{userSelectedUnit}'");

if (matchingRows.Length > 0)
{
    var firstMatchingRow = matchingRows[0];

    // Use firstMatchingRow here.
}
您可以在其中扔一些LINQ,但是先了解替代方法确实是一个好主意,因为这样您就可以更好地了解LINQ在后台执行的操作。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
There's no need to use LINQ. You've already got everything you need. Select returns a DataRow array and you can then get the first element from that array, if it exists.
C#:
var matchingRows = dt.Select($"Units = '{userSelectedUnit}'");

if (matchingRows.Length > 0)
{
    var firstMatchingRow = matchingRows[0];

    // Use firstMatchingRow here.
}
您可以在其中扔一些LINQ,但是先了解替代方法确实是一个好主意,因为这样您就可以更好地了解LINQ在后台执行的操作。

JMC,我的版本有什么问题吗?即,如果您的列不唯一,它会开始掉落吗? -这让我很想

我在DataTable上对此进行了测试,在第1列中找到该条目后,它确实返回了第2列("Units").
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,499
地点
悉尼,澳大利亚
编程经验
10+
JMC,我的版本有什么问题吗?即,如果您的列不唯一,它会开始掉落吗? -这让我很想

我在DataTable上对此进行了测试,在第1列中找到该条目后,它确实返回了第2列("Units").
我看不到您的代码有问题。如果有多个匹配项,那么您将获得最后一个匹配项,但这种情况似乎暗示无论如何永远不会有多个匹配项。
 

ConsKa

知名会员
已加入
2020年12月11日
留言内容
85
编程经验
Beginner
C#:
double min_val = Convert.ToDouble(dt.Rows[row][1].ToString());

我想问这个问题,只是想着我不确定要问的事情以进一步理解。

来自数据表的数据-如果不对数据进行To.String操作,则显示为Datarow.System-但是它在数据表中是否具有固有类型?

在数据库中,您将提供类型,int,nvarchar等,但我们无法为DataTable做到这一点,但是C#将根据赋值运算符的右侧为var变量提供类型-因此C#可以根据需要分配类型。

在代码片段中,似乎需要min_val为double,并且代码转换为double,但最终将其设为To.String。

在我看来,ToString的末尾会否定双精度,因为无论您在开始时做了什么,都将其更改为末尾的String?

因此,如果您要运行代码并将鼠标悬停在上面,min_val将是一个'string min_val'变量-而不是double min_val-因为C#需要将其转换回字符串类型以包含它具有的To.String()创建了吗?

我会对以上所有内容说...。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
就我个人而言,我认为DataTable是错误的数据结构。字典似乎更合适:
C#:
class FlowRate
{
    public double 敏 { get; }
    public double 规范 { get; }
    public double 最高 { get; }

    public FlowRate(double min, double norm, double max)
    {
        敏 = min;
        规范 = norm;
        最高 = max;
    }
}

Dictionary<string, FlowRate> FlowRates = new Dictionary<string, FlowRate()
{
    ["gpm_us"] = new FlowRate(5, 15, 30),
    ["l/min"] = new FlowRate(18.93, 56.78, 113.56),
    ["m3/hr"] = new FlowRate(1.14, 3.41, 6.81),
    ["bbl/day"] = new FlowRate(171.43, 514.29, 1028.57),
    ["bbl/hr"] = new FlowRate(7.14, 21.43, 42.86),
};

:

Console.WriteLine(FlowRates["m3/hr"].Norm);
 
最佳 底部