问题描述
我上了这个课:
private void Get_properties<T>(ObservableCollection<T> collection)
{
List<string> longest_values = new List<string>();
var properties = typeof(T).GetProperties();
foreach (var prop in properties)
{
var prop_value = collection.OrderByDescending(y=> prop.GetValue(y,null)).FirstOrDefault();
longest_values.Add(prop_value);
}
//Now I want to do something with this List
foreach (var item in longest_values)
{
//..
}
}
我试图通过LINQ查找集合中具有最长字符串值的每个属性的值。我该怎么办?
解决方法
更新
这将为您提供“每个项目的所有属性中最长字符串的第一个 ”
或者说另一种方式。这将遍历泛型列表,获取所有属性及其值(其中的值是字符串),然后获取第一个值(按长度降序排列)
var result = typeof(T)
.GetProperties()
.Where(x => x.PropertyType == typeof(string))
.Select(prop => collection
.Select(y => (string) prop.GetValue(y,null))
.OrderByDescending(z => z.Length)
.FirstOrDefault())
.ToList();
foreach (var item in result)
Console.WriteLine(item);
原始
我认为您与OrderByDescending
略有偏离,您想要一个Select
然后是orderby或orderby然后选择也许?无论哪种方式,都会为您提供列表中每个对象的属性值列表
var properties = typeof(T).GetProperties();
foreach (var prop in properties)
{
var prop_values = collection.Select(y => prop.GetValue(y,null));
Console.WriteLine(string.Join(",",prop_values));
}
,
由于prop_value是object
,因此您要用一个值调用string.Join(string,parm object[])
,该值等于;
Console.WriteLine(prop_value?.ToString());
默认的ToString()
方法返回对象的类型名称。