泛型-获取属性LINQ

问题描述

我上了这个课:

  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()方法返回对象的类型名称。