Сортировка DataTable с использованием LINQ - PullRequest
1 голос
/ 16 ноября 2011

У меня есть DataTable, который имеет следующую структуру. StartDate (Тип DateTime) EndDate (Тип DateTime) Описание (Введите текст)

Мне нужно проверить, совпадают ли даты или нет, то есть, если Дата начала 1 элемента меньше, чем Конечная дата предыдущего элемента.

Вот код, который я написал.

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

dtDates.DefaultView.Sort = "StartDate ASC"; //Sort the DataTable based on the Start Dates
if(dtDates.Rows.Count > 1) //Check only if more than 1 Date is specified
{
    for (int i = 1; i < dtDates.Rows.Count; i++)
    {
        if(TypeConvert.ToDate(dtDates.Rows[i]["StartDate"] < TypeConvert.ToDate(dtDates.Rows[i-1]["EndDate"])
            {
                retVal = true;
                currentRow = i;
                break;
            }
     }
}

Приведенный выше код работает нормально.

Но теперь я хочу реализовать это с помощью LINQ

Итак, вот код, который я пытаюсь попробовать.

Как я могу сделать полное сравнение, используя LINQ?

    public static bool CheckIfDatesOverlap(DataTable dataTable)
    {
        bool retVal = false;
        int currentRow = 0;
        List<DataRow> listDates = (from DataRow dgv in dataTable.Rows
                                               select dgv).OrderBy(x => x[StartDate]).ToList();
        if (listDates.Count > 1) //Perform Comparision only if more than 1 row is present
        {
            for (int i = 1; i < listDates.Count; i++)
            {
                if (TypeConvert.ToDateTime(listDates[i][StartDate]) < TypeConvert.ToDateTime(listDates[i][EndDate]))
                {
                    retVal = true; //There are duplicates, hence return true
                    currentRow = i;
                    break;
                }
                else
                {
                    //Do nothing as dates do not overlap
                }
            }
        }
        else
        {
            retVal = false; //As there is only 1 row, return false
        }
        if (retVal)
        {
            string message = "Dates Overlap";
            //Display message
        }
        return retVal;
    }

1 Ответ

4 голосов
/ 16 ноября 2011

Если вы используете SelectWithPrevious, описанное здесь , тогда вы можете написать следующее:

bool datesOverlap = table.Rows
    .Cast<DataRow>()
    .SelectWithPrevious((current, previous) => new
        {
            PreviousEndDate = (DateTime)previous["EndDate"],
            StartDate = (DateTime)current["StartDate"]
        })
    .Any(x => x.StartDate < x.PreviousEndDate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...