Преобразуйте DataTable в IEnumerable <T>

Вам необходимо заменить .+ на что-то, что соответствует только тому, что вы хотите вернуть. Поскольку вы хотите соответствовать только буквенно-цифровому тексту, используйте \w вместо .

r'(?:\(PID-\d{6}\):)\s*(\w+)'

Вам нужно \s* перед второй группой, потому что пробел перед буквенно-цифровым текстом не будет совпадать \w+ .

Вам также не нужно .+ в начале. Совпадение только начинается там, где оно находит PID.

ДЕМО

40
задан panda.o24 23 June 2015 в 08:52
поделиться

3 ответа

В этой реализации нет ничего плохого. Вы можете попробовать ключевое слово yield , посмотрите, как оно вам понравится:

private IEnumerable<TankReading> ConvertToTankReadings(DataTable dataTable)
    {
        foreach (DataRow row in dataTable.Rows)
        {
            yield return new TankReading
                                  {
                                      TankReadingsID = Convert.ToInt32(row["TRReadingsID"]),
                                      TankID = Convert.ToInt32(row["TankID"]),
                                      ReadingDateTime = Convert.ToDateTime(row["ReadingDateTime"]),
                                      ReadingFeet = Convert.ToInt32(row["ReadingFeet"]),
                                      ReadingInches = Convert.ToInt32(row["ReadingInches"]),
                                      MaterialNumber = row["MaterialNumber"].ToString(),
                                      EnteredBy = row["EnteredBy"].ToString(),
                                      ReadingPounds = Convert.ToDecimal(row["ReadingPounds"]),
                                      MaterialID = Convert.ToInt32(row["MaterialID"]),
                                      Submitted = Convert.ToBoolean(row["Submitted"]),
                                  };
        }

    }

Также AsEnumerable не требуется, поскольку List является уже IEnumerable

45
ответ дан 27 November 2019 в 01:17
поделиться

Я написал статью об этом предмете более чем здесь . Я думаю, что это могло помочь Вам.

Обычно это делает что-то как этот:

static void Main(string[] args)
{
    // Convert from a DataTable source to an IEnumerable.
    var usersSourceDataTable = CreateMockUserDataTable();
    var usersConvertedList = usersSourceDataTable.ToEnumerable<User>();

    // Convert from an IEnumerable source to a DataTable.
    var usersSourceList = CreateMockUserList();
    var usersConvertedDataTable = usersSourceList.ToDataTable<User>();
}
0
ответ дан 27 November 2019 в 01:17
поделиться

Также существует метод DataSetExtension под названием «AsEnumerable ()» (в System.Data), который принимает DataTable и возвращает Enumerable. См. документ MSDN для получения дополнительных сведений, но в основном это так же просто, как:

dataTable.AsEnumerable()

Обратной стороной является то, что он перечисляет DataRow, а не ваш собственный класс. Однако вызов LINQ «Select ()» может преобразовать данные строки:

private IEnumerable<TankReading> ConvertToTankReadings(DataTable dataTable)
{
    return dataTable.AsEnumerable().Select(row => new TankReading      
            {      
                TankReadingsID = Convert.ToInt32(row["TRReadingsID"]),      
                TankID = Convert.ToInt32(row["TankID"]),      
                ReadingDateTime = Convert.ToDateTime(row["ReadingDateTime"]),      
                ReadingFeet = Convert.ToInt32(row["ReadingFeet"]),      
                ReadingInches = Convert.ToInt32(row["ReadingInches"]),      
                MaterialNumber = row["MaterialNumber"].ToString(),      
                EnteredBy = row["EnteredBy"].ToString(),      
                ReadingPounds = Convert.ToDecimal(row["ReadingPounds"]),      
                MaterialID = Convert.ToInt32(row["MaterialID"]),      
                Submitted = Convert.ToBoolean(row["Submitted"]),      
            });
}
59
ответ дан 27 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: