【问题标题】:Lambda expression to get a list of properties from a List<BaseClass> when the property is defined in a DerivedClass当属性在 DerivedClass 中定义时,用于从 List<BaseClass> 获取属性列表的 Lambda 表达式
【发布时间】:2020-08-14 18:42:18
【问题描述】:

我正在编写代码以在不同应用程序之间交换信息。所有应用程序都定义相同的实体,但并非所有应用程序都存储相同的信息。

所有应用程序都定义了 Animal 类,但是:

  • ApplcationA 指定:属、种、地理分布
  • ApplcationB 指定:属、种、估计种群

我有一个独立的 dll 应用程序 (MyApplication.dll),我在其中定义了一个带有公共信息的类 MyAnimal:

public class MyAnimal
{
   public string Genus { get; set; }
   public string Species { get; set; }
}

还有一个包含动物列表的 MyAnimals 类

public class MyAnimals
{
   public List<MyAnimal> ListOfAnimals { get; set; }
}

ApplicationA 和 ApplicationB 提供 dll 来访问它们的信息。但唯一的方法是创建一个插件并在应用程序本身中执行它。

为 ApplicationA 创建了以下类

public class AppMyAnimal : MyAnimal
{
   public Animal SourceAnimal { get; set; } // the animal as defined by ApplicationA
   public bool IsSelected { get; set; }

   public AppMyAnimal(Animal animal)
   {
      // Set properties of Derived class
      SourceAnimal = animal;

      // Set properties of Base class
      Genus = animal.Genus;
      Species = animal.Species;
   }
}

public class AppMyAnimals : MyAnimals
{
   public AppMyAnimals()
   {
      ListOfAnimals = new List<MyAnimal>(); // List of animals of Base class MyAnimal; not of Derived class AppMyAnimal
   }
}

在 ApplicationA 中,我有一个函数可以填充 AppMyAnimals 类中的动物列表:

  private void ReadAnimals()
  {
     AppMyAnimals my_animals = new AppMyAnimals();
     List<Animal> list_of_animals = ClassInApplicationA.GetAnimals(); // list of animals as defined by ApplicationA
     foreach (Animal i_animal in list_of_animals)
     {
        AppMyAnimal app_my_animal = new AppMyAnimal(i_animal);
        my_animals.ListOfAnimals.Add(app_my_animal); // ok to assing Derived type to Base type (covariance)
     }
  }

我有一个表格来选择动物。选中的动物将 AppMyAnimal 中的 IsSelected 属性设置为 true。

我可以将 AppMyAnimals 和 AppMyAnimal 序列化为 MyAnimals 和 MyAnimal 以将信息传递给 ApplicationB。

但在 ApplicationA 中,我想获取所选动物的列表,但属于 Animal 类(由 ApplicationA 定义):

List<Animal> list_of_selected_animals = ...

我的第一个问题是如何使用 Lambda 表达式。第二个问题是对于这种情况是否有更好的设置。

提前致谢!

【问题讨论】:

  • 不确定我是否理解这个问题。你不是只需要抓住源动物吗?例如。 List&lt;Animal&gt; list_of_selected_animals = my_animals.Select( x =&gt; x.SourceAnimal) ).ToList()
  • 我有List&lt;MyAnimal&gt;,当IsSelected 为真时我需要List&lt;Animal&gt;。对象MyAnimal 和属性IsSelected 属于AppMyAnimal 类。

标签: c# lambda covariance


【解决方案1】:

我有List&lt;MyAnimal&gt;,当IsSelected 为真时我需要List&lt;Animal&gt;。对象MyAnimal 和属性IsSelected 在类AppMyAnimal

var listOfMyAnimal = new List<MyAnimal>();
var listOfSelectedAnimal = listOfMyAnimal
    .Where( x => x.IsSelected )
    .Select( x => x.SourceAnimal )
    .ToList();

【讨论】:

  • 如果没有.Cast&lt;AppMyAnimals&gt;(),将显示以下消息:“MyAnimal”不包含“IsSelected”的定义,并且找不到接受“MyAnimal”类型的第一个参数的扩展方法“IsSelected”(您是否缺少 using 指令或程序集引用?)–
猜你喜欢
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多