【问题标题】:Generics - get properties LINQ泛型 - 获取属性 LINQ
【发布时间】:2020-08-12 06:32:18
【问题描述】:

我有这门课:

  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 查找集合中具有最长字符串值的每个属性的值。我该怎么做?

【问题讨论】:

  • 代码中的注释中似乎有一个单独的问题:"// 仅返回类型名称(例如 My_project.Models.My_model)" - 是否与这个问题?
  • “不起作用”是什么意思?你期待什么?当然string.Join 必须将你的实际Type 转换为一些string-表示,这是使用ToString 完成的。
  • 是否要按降序打印属性的实际值?
  • @Lucy82 这是否意味着您实际上只想考虑字符串属性而不是所有属性?
  • 您的编辑完全没有帮助。您仍然没有提及您想用该代码实现什么,也没有提及“不工作”的实际含义。如果您只想将当前的 working 代码转换为 LINQ,则必须提供该 working 代码。您希望这里的任何人如何猜测您的问题到底是什么?

标签: c# linq generics propertyinfo


【解决方案1】:

更新

这将为您提供“每个项目的所有属性中最长的字符串中的第一个

或者换一种说法。这将遍历通用列表,获取所有属性及其值(其中为字符串),然后获取第一个值(按长度降序排列)

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)); 
}

【讨论】:

  • 是的,这给了我价值,但我该如何对它们进行排序?我需要的只是每个属性的一个值 - It 的最长字符串值。
  • @Lucy82 所以你只想要字符串?以及每个项目的所有属性中最长的字符串中的第一个?
  • 不像你说的那样。我需要每个属性的最长字符串中的第一个。集合中的项目是列表,因此集合中的所有列表都需要检查属性值并输出最长的一个,就是它。我希望你明白:)
  • @Lucy82 我知道,我很棒对吧?反正祝你好运。确保当你问下一个问题时更具体一点;)
  • awesome 是谦虚的描述 :))...对不起,我下次会尝试更准确。
【解决方案2】:

由于 prop_value 是 object,因此您使用单个值调用 string.Join(string, parm object[]),这相当于;

Console.WriteLine(prop_value?.ToString());

并且默认的ToString()方法返回对象的类型名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2020-01-29
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多