Справка по программированию в C # - PullRequest
0 голосов
/ 03 октября 2010

Я пишу отдельную позицию, а значения такие:

Ad#        Pub#     Loc    date    line#
ad1        P001     AK     093010   1
ad1        P001     AK     093010   2
ad1        P001     AK     093010   3
ad1        P001     AK     100110   1

Когда ad #, Pub #, loc и date совпадают с предыдущей записью, строка увеличивается. Как только любое из значений в объявлении, пабе, loc и дате изменяется по сравнению с предыдущей записью, значение строки снова изменяется на 1. Я пишу эти строки в цикле for. Мне нужно знать, какую логику мне нужно использовать, чтобы получить значения строки #? Использовать ли массив для хранения значений предыдущей строки в массиве и сравнить их с текущими значениями строки, а если они совпадают, то добавить 1 к строке #. Есть ли лучшая логика? Или есть лучший способ, кроме массивов, чтобы сравнить предыдущую строку и текущую строку

Эти значения получены из различных таблиц.

for (int l = 0; l < totalrecords; l++)
{
    for (int i = 0; i < fields.Length; i++)
    {
        if (i == 0)
        {
            // logic to get the value for field 1
        }
        else if (i == 1)
        {
            // logic to get the value for field 2
        }
        if (i == 3)
        {
            // logic to get the value for field 3
        }
        else if (i == 4)
        {
            // logic to get the value for field 4
        }
        else if (i == 5)
        {
            // What would be the logic to write the line#???
        }
    }
}

спасибо Пради

Ответы [ 2 ]

1 голос
/ 03 октября 2010

Прежде всего, я не знаю, зачем вам нужен внутренний i цикл; Является ли количество полей динамическим?

В любом случае, вернемся к вашему вопросу. Не зная, является ли ваш источник DataTables, DataReaders, Arrays и т. Д., Трудно ответить.

Но да, я помню предыдущие значения между итерациями и сбрасывал номер строки, когда текущие значения различаются.

Если используется DataTable, я обычно использую эту логику:

var dt = ...
for(var rowIndex = 0; rowIndex < dt.Rows.Count;)
{
    // start of new set
    var curAd = (string)dt.Rows[rowIndex]["ad"];
    var curPub = (string)dt.Rows[rowIndex]["pub"];
    var curLoc = (string)dt.Rows[rowIndex]["loc"];
    var curDate = (DateTime)dt.Rows[rowIndex]["date"];
    var line = 1;

    for (; rowIndex < dt.Rows.Count;)
    {
        // end of set?
        if (curAd != (string)dt.Rows[rowIndex]["ad"] ||
           curPub != (string)dt.Rows[rowIndex]["pub"] ||
           curLoc != (string)dt.Rows[rowIndex]["loc"] ||
           curDate != (DateTime)dt.Rows[rowIndex]["date"])
        {
            break;
        }

        // write out current values with new line number
        // ...

        // get ready for next row
        rowIndex++;
        line++;
    }

    // key fields have changed, or eof, loop around to terminate or start new set as needed

}

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

Я уверен, что LINQ может сделать это тоже легко.

1 голос
/ 03 октября 2010

Вероятно, самый идиоматический способ представления значений, чтобы их можно было легко сравнить, - это загрузить их в некоторый класс и реализовать интерфейс *1003* в этом классе.

Объявление класса будет выглядеть примерно так:

class Item : IComparable<Item> { 
  public string Loc { get; private set; }
  public Item(Field[] fields) {
    Loc = // logic to get value of 'Loc'
    // Load all other values
  }
  public int CompareTo(Item other) {
    int res = Loc.CompareTo(other.Loc);
    if (res != 0) return res; 
    // .. compare other fields
  }
}

Тогда вы можете просто перебрать все записи, создать из них объекты, написав new Item(fields).Когда у вас есть два поля, вы можете сравнить их, просто написав f1.CompareTo(f2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...