Вам необходимо заменить .+
на что-то, что соответствует только тому, что вы хотите вернуть. Поскольку вы хотите соответствовать только буквенно-цифровому тексту, используйте \w
вместо .
r'(?:\(PID-\d{6}\):)\s*(\w+)'
Вам нужно \s*
перед второй группой, потому что пробел перед буквенно-цифровым текстом не будет совпадать \w+
.
Вам также не нужно .+
в начале. Совпадение только начинается там, где оно находит PID
.
В этой реализации нет ничего плохого. Вы можете попробовать ключевое слово 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
Я написал статью об этом предмете более чем здесь . Я думаю, что это могло помочь Вам.
Обычно это делает что-то как этот:
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>();
}
Также существует метод 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"]),
});
}