C# 访问数据表记录的C代码优化

C# 访问数据表记录的C代码优化,c#,asp.net,optimization,dictionary,datatable,C#,Asp.net,Optimization,Dictionary,Datatable,我对datatable有一个成本问题。我需要用更智能的代码替换代码 我有一个datatable,示例值如下: 列:id、用户id、开始时间、结束时间 行样本:1,5,05.10.2009 08:00:00,05.10.2009 17:00 我的伪代码是 function something() { for(int i=0;i<datatable.Rows.Length;i++) { if(Someobject.variable.Equals(dt.R

我对datatable有一个成本问题。我需要用更智能的代码替换代码

我有一个datatable,示例值如下:

列:id、用户id、开始时间、结束时间

行样本:1,5,05.10.2009 08:00:00,05.10.2009 17:00

我的伪代码是

    function something()
    {
    for(int i=0;i<datatable.Rows.Length;i++)
    {
    if(Someobject.variable.Equals(dt.Rows[i][user_id].ToString()))
    {
    if(Date.Compare(somevariable,dt.Rows[i][starttime].ToString())!=0)
    {
    //Do something
    }
    }
    }
}

这是直接来自数据库吗?如果是这样,为什么不执行查询以获得更具体的结果集呢?然后可以使用linq在每一行上执行函数

更多定义的SQL: 从表中选择*,其中userID='bob'和starttime介于'1/1/2009 11:00 PM'和'1/1/2009 11:21 PM'之间

林克:

datatable有一千多行,函数必须被调用近一千次

这是你的问题。如果我读对了,那么您将遍历整个datatable,查找问题中未显示的其他数据集合中的每一项

解决这一问题的最佳方法是在数据库级别:无论您要生成此datatable做什么,都需要了解其他数据集,以便在数据库中考虑这些数据集,并利用索引和缓存数据等。这可能意味着编写一个比您习惯的查询复杂得多的select查询,但这是正确的方法

如果这不是一个选项,那么您仍然希望以某种方式重新处理它,以便您只需对所有内容交互一次。如果您使用的是c语言,那么您可能可以通过linq查询或者甚至仅仅通过IEnumerable extensions+lambda方法来实现这一点


关于使用字典:它可能只需要两个变量,但其中一个变量可能是更复杂的对象,比如表中的整个数据行。无论哪种方式,为了给您提供任何类似于示例代码的内容,我们需要更好地了解其他数据的外观以及您的预期结果。

这个怎么样?如果您可以将此查询推送到数据库中,那就更好了。但这比循环每一行要快

void something(DataTable dt, myobj Someobject, DateTime somevariable)
{
    string filterPattern = "user_id='{0}' AND starttime='{1}'";
    string filter = string.Format(filterPattern, 
                                  Someobject.variable, 
                                  somevariable);
    DataRow[] rows = dt.Select(filter);

    foreach (DataRow row in rows)
        DoSomething(row);
}
void DoSomething(DataRow row)
{
}
public class myobj
{
    public string variable { get; set; }
}

是,从数据库查询填充数据表。实际上,组件有时隙,在创建的时隙事件中,我需要检查用户是否在开始时间和结束时间之间工作,因此我禁用了时隙。我不知道我可以和林克一起做。你能给我一个样本吗?是的,我完全同意你的观点,循环才是真正的问题。情况是这样的:我有一个radscheduler组件,它有一个timeslotcreated事件。在页面加载时,我需要根据用户检查该时间段是启用还是禁用。这个事件被称为近千次。所以我不能改变它。我必须做的是尽可能快地从数据表或其他东西中获取信息。明天我可以粘贴示例代码和示例数据,但现在我没有。同样感谢您的回答。在这种情况下,您可能希望在获得datatable后尽快构建一个字典,并将其保存在一个好的、公开的地方,这样您就不必一直返回db获取它。
private DataTable calismaSaatiGetir(string yonetici_id)
    {
        SqlConnection connection = new SqlConnection();
        connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlCommand command = new SqlCommand();
        command.CommandText = "select calisma_saati.id,kullanici.id as hekim_id,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' ' +LEFT(CONVERT(VARCHAR,calisma_saati.baslangic_saati,108),5) AS calisma_baslangic,LEFT(CONVERT(VARCHAR,calisma_saati.tarih,104),10)+ ' '+LEFT(CONVERT(VARCHAR,calisma_saati.bitis_saati,108),5) AS calisma_bitis from calisma_saati JOIN kullanici ON kullanici.id=calisma_saati.kullanici_id WHERE  yonetici_id='" +  Session["yonetici"].ToString() + "' ";
        command.Connection = connection;
        connection.Open();
        SqlDataAdapter da = new SqlDataAdapter(command.CommandText, connection);
        DataSet ds = new DataSet();
        da.Fill(ds, "calisma_saati");
        calismaSaatleridt = ds.Tables["calisma_saati"];
        connection.Close(); 
        return calismaSaatleridt;
    }
DataTable table = getFromDb();
table.Rows.Cast<DataRow>().ToList().ForEach(x => RunMyFunction(x));

void RunMyFunction(DataRow row)
{

}
void something(DataTable dt, myobj Someobject, DateTime somevariable)
{
    string filterPattern = "user_id='{0}' AND starttime='{1}'";
    string filter = string.Format(filterPattern, 
                                  Someobject.variable, 
                                  somevariable);
    DataRow[] rows = dt.Select(filter);

    foreach (DataRow row in rows)
        DoSomething(row);
}
void DoSomething(DataRow row)
{
}
public class myobj
{
    public string variable { get; set; }
}