需要一种有效的方法来解决c#中的简单问题

时间:2010-11-09 13:01:13

标签: c# asp.net

我正在使用c#开发一个Web应用程序。我正在从数据库中读取一些名为dt的数据表。样本数据如下所示。

agentName  WeekNumber Score 
John       3          45
John       5          78
John       6          33

我想根据某些条件对上述数据进行一些更改。因为我想根据这些数据绘制图形。代理名称始终相同。周字段是唯一的。我想使用下面列出的条件创建一个新的数据表。

1 - 新数据表周字段必须从1开始。如果第1周数据表中没有条目,您可以将数据添加到新数据表中,如下所示

John 1  0

这意味着只需将0作为分数。

2 - 如果从数据库获取的数据表中第二行以后有任何缺失的周数,则添加该周的行,得分为-1。 在上面的例子中,在第一行之后有一个缺失的第4周。所以将它添加到得分为-1的新数据表

新数据标签; e示例数据位于

之下
agentName WeekNumber Score
John      1          0
John      2          0
John      3          45
John      4         -1
John      5         78
John      6         33

如何使用c#在有效的方法中完成?行数会有所不同。 我想用c#来做。不是因为某种原因使用查询

2 个答案:

答案 0 :(得分:3)

在数据库中有一个表,其中包含一年中每周的默认值。 左边在选择结果时加入此表,如果缺少另一个则采用默认值。

e.g。

select 
    dt.name, 
    def.week_no, 
    (case dt.value is null then def.value else dt value end) value
from 
    def left join dt on def.week_no = dt.week_no

代码未经测试,但应该从默认表中获取所有内容,并从dt表中获取它们存在的行。如果dt行不存在,则将采用默认值。

其中dt是包含值的现有表,def是每周默认值的表。

答案 1 :(得分:2)

您可以使用以下类并从中构建新表。

class AgentsData
{
    public static DataTabe ProcessDataTabe(DataTable dt)
    {
        Dictionary<string, AgentData> data = new Dictionary<string, AgentData>();

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            string name = dt.rows[i][0].ToString();
            if (!data.ContainsKey(name))
                data.Add(name, new AgentData);
            int week = Convert.ToInt32(dt.rows[i][1]);
            int score = Convert.ToInt32(dt.rows[i][2]);

            data[name].Add(week, score);
        }

        foreach (vat agentData in data.Values)
            agentData.Process();

        //now build new data table from dictionary and return it
    }   
}

class AgentData
{
    public AgentData(string name)
    {
        Name = name;
        WeekScore = new Dictionary<int,int>();
    }

    public void Add(int weekNumber, int score)
    {
        WeekScore[weekNumber] = score;
    }

    public void Process()
    {
        int min = WeekScore.Keys.Min();
        int max = WeekScore.Keys.Max();

        for (int i = 0; i < min; i++)
            WeekScore.Add(i, 0);

        for (int i = min + 1; i < max; i++)
            if (!WeekScore.ContainsKey(i))
                WeekScore.Add(i, -1);
    }

    public string Name {get; private set;}  
    public Dictionary<int, int> WeekScore { get; private set;}
}