Linq计数在特定列中。
DataTable dt = new DataTable(); List <> list = DataTable(); label1.Text = list.Count ....在哪里? label2.Text = list.Count ....在哪里?
答案 0 :(得分:1)
对于第一个问题:
为了将datatable
转换为List
,首先必须定义一个与数据表的列匹配的类。
由于您尚未为Datatable
定义任何架构。
例如,我将使用名为dtUsers
的数据表,其中3 cols
和2 rows
为:
----------------------------
| Id | Fname | Lname |
----------------------------
| 1 | John | Wick |
----------------------------
| 2 | Keanu | Reeves |
----------------------------
将其转换为类,如下:
public class User
{
public int Id {get:set;}
public string Fname {get:set;}
public string Lname {get:set;}
}
现在有 2 种方法可以实现它:
使用Newtonsoft.Json( Fast )
将Datatable
转换为List
的最简单方法是将数据表serializing
并将其deserializing
转换为class
。
按照上面的示例,这是完成的方式:
//Assuming that the data is already in the datatable "dtUsers" we first serialize it.
var strUsers = JsonConvert.SerializeObject(dtUsers);
//will output an searialized object of the datatable as:'[{Id:1,"Fname":"John","Lname":"Wick"},{Id:2,"Fname":"Keanu","Lname":"Reeves"}]'
//now deserialize it back into a List<User> as:
var lstUsers = JsonConvert.DeserializeObject<List<User>>(strUsers);
通过匹配属性信息(慢)
如果T
是通用方法,则可以使用给定的方法将数据表转换为List。
在这里,我们首先使datatable用作AsEnumerable
,然后遍历datatable中的每一行,并将它们传递到createObject<T>(row)
函数中以获取其类对象,然后将其附加到列表中并返回转换后的对象。
public List<T> ConvertDatatableToList<T>(DataTable table) where T : class, new()
{
try
{
List<T> list = new List<T>();
foreach (var row in table.AsEnumerable())
{
var obj = createObject<T>(row);
list.Add(obj);
}
return list;
}
catch (Exception ex)
{
throw null;
}
}
public T createObject<T>(DataRow row) where T : class, new()
{
T obj = new T();
//itterating over the properties defined in the class
foreach (var prop in obj.GetType().GetProperties())
{
try
{
//checking if the property is a generic type and if it is Nullable(?)
if (prop.PropertyType.IsGenericType && prop.PropertyType.Name.Contains("Nullable"))
{
if (!string.IsNullOrEmpty(row[prop.Name].ToString()))
prop.SetValue(obj, Convert.ChangeType(row[prop.Name], Nullable.GetUnderlyingType(prop.PropertyType), null));
}
else
prop.SetValue(obj, Convert.ChangeType(row[prop.Name], prop.PropertyType), null);
}
catch
{
continue;
}
}
return obj;
}
用法:
var lstUsers = ConvertDatatableToList<User>(dtUsers);
关于第二个问题:
要获取计数,您可以将条件放入Where()
中并对其进行计数,也可以将条件直接放入Count()
本身中:
对于带有Where()
的特定列:
var FnameCount = lstUsers.Where(w=>w.Fname=="John").Count();
对于仅包含Count()
的特定列:
var FnameCount = lstUsers.Count(w=>w.Fname=="John");