2010-11-09 2 views
1

Я разрабатываю веб-приложение с помощью C#. Я читаю некоторые данные из базы данных в таблицу данных с именем dt. Пример данных показан ниже.Нужен эффективный способ для простой задачи в C#

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

Я хочу внести некоторые изменения в приведенные выше данные, основываясь на некоторых условиях. Потому что я хочу нарисовать график на основе этих данных. Имя агента всегда одинаково. И поле недели уникально. Я хочу создать новую таблицу данных, используя условия, перечисленные ниже.

1-Новая таблица данных недели поле должно начинаться с 1.Если нет записи в таблице данных на 1-й неделе, вы можете добавить данные в новую таблицу данных, как показано ниже

John 1 0 

его означает просто дать 0 в качестве оценки.

2-Если в таблице данных, полученной из базы данных, есть недостающие недели, начиная с второй строки, добавьте строку на этой неделе со счетом -1. в приведенном выше примере после того, как первый ряда есть недостающая неделя 4. так добавить его в новую таблицу данных со счетом -1

новой вкладка данных; е для данных выборки является шоном ниже

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

Как могу ли я сделать это эффективным методом с использованием C#? Количество строк будет отличаться. Я хочу сделать это с помощью C#. не используя запросы по какой-то причине

+2

Так что вы называете «эффективными»: Вы хотите, чтобы свести к минимуму сетевой трафик, использование дискового пространства, использование памяти эффективным, или вы хотите лучшую производительность на системе с тысячами пользователей одновременно? – GvS

+0

Вы действительно хотите добавить эти записи или просто суммировать их позже? Потому что решение для второго было бы возможно (и, возможно, даже проще) без этих «фиктивных записей». – MatthiasG

+0

Вы что-то пробовали и нашли его недостаточно эффективным? –

ответ

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;} 
} 
+0

Танк у вас все .... –

3

У вас есть таблица в базе данных со значениями по умолчанию для каждой недели в году. Слева Присоединитесь к этому столу, когда вы выбираете свои результаты и принимаете значение по умолчанию, если другое отсутствует.

например.

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 - таблица со значением по умолчанию для каждой недели.

+0

Значение по умолчанию отсутствует, иногда оно равно 0 и иногда -1. –

+0

+1 Итай, и я хочу использовать C#, а не с помощью запросов. :(Спасибо –

+2

Если вы позволите выполнить этот запрос с сервера db, вы можете быть уверены, что он будет очень «эффективным». И если вы присоедините его к списку всех возможных недель и узнаете, какой из них является первым «реальным» ", вы можете решить, нужно ли вам вставлять 0 или -1.edit: oh, нет запросов :(Кроме того, что решение выше может быть реализовано с помощью linq. – MatthiasG