현재, 나는 다음을 사용하고 있습니다 :
DataTable dt = CreateDataTableInSomeWay();
List<DataRow> list = new List<DataRow>();
foreach (DataRow dr in dt.Rows)
{
list.Add(dr);
}
더 나은 / 마법적인 방법이 있습니까?
답변
.NET 3.5를 사용 DataTableExtensions.AsEnumerable
하는 경우 (확장 방법)을 사용할 수 있으며 실제로 List<DataRow>
대신에 필요한 경우 다음 IEnumerable<DataRow>
을 호출 할 수 있습니다 Enumerable.ToList
.
IEnumerable<DataRow> sequence = dt.AsEnumerable();
또는
using System.Linq;
...
List<DataRow> list = dt.AsEnumerable().ToList();
답변
List<Employee> emp = new List<Employee>();
//Maintaining DataTable on ViewState
//For Demo only
DataTable dt = ViewState["CurrentEmp"] as DataTable;
//read data from DataTable
//using lamdaexpression
emp = (from DataRow row in dt.Rows
select new Employee
{
_FirstName = row["FirstName"].ToString(),
_LastName = row["Last_Name"].ToString()
}).ToList();
답변
C # 3.0 및 System.Data.DataSetExtensions.dll을 사용하면
List<DataRow> rows = table.Rows.Cast<DataRow>().ToList();
답변
당신은 사용할 수 있습니다
List<DataRow> list = new List<DataRow>(dt.Select());
dt.Select()
는 테이블의 모든 행을 데이터 행의 배열로 반환하고 List
생성자는 해당 객체 배열을 인수로 받아 들여 처음에 목록을 채 웁니다.
답변
확장 기능을 다음과 같이 만들 수 있습니다.
public static List<T> ToListof<T>(this DataTable dt)
{
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
var columnNames = dt.Columns.Cast<DataColumn>()
.Select(c => c.ColumnName)
.ToList();
var objectProperties = typeof(T).GetProperties(flags);
var targetList = dt.AsEnumerable().Select(dataRow =>
{
var instanceOfT = Activator.CreateInstance<T>();
foreach (var properties in objectProperties.Where(properties => columnNames.Contains(properties.Name) && dataRow[properties.Name] != DBNull.Value))
{
properties.SetValue(instanceOfT, dataRow[properties.Name], null);
}
return instanceOfT;
}).ToList();
return targetList;
}
var output = yourDataInstance.ToListof<targetModelType>();
답변
“ID”int 필드의 값 목록 만 반환하려면 다음을 사용할 수 있습니다.
List<int> ids = (from row in dt.AsEnumerable() select Convert.ToInt32(row["ID"])).ToList();
답변
nullable 유형의 경우 예외를 반환하기 때문에이 답변 ( https : //.com/a/24588210/4489664 ) 에서 코드에 약간의 수정 사항을 추가 했습니다.
public static List<T> DataTableToList<T>(this DataTable table) where T: new()
{
List<T> list = new List<T>();
var typeProperties = typeof(T).GetProperties().Select(propertyInfo => new
{
PropertyInfo = propertyInfo,
Type = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType
}).ToList();
foreach (var row in table.Rows.Cast<DataRow>())
{
T obj = new T();
foreach (var typeProperty in typeProperties)
{
object value = row[typeProperty.PropertyInfo.Name];
object safeValue = value == null || DBNull.Value.Equals(value)
? null
: Convert.ChangeType(value, typeProperty.Type);
typeProperty.PropertyInfo.SetValue(obj, safeValue, null);
}
list.Add(obj);
}
return list;
}
