如何将列表或数组转换为 C# 中的子类型?

彼得·昆斯特

我有一个包含对象列表成员的类。假设我有一个 Animal 基类和 Cat 和 Dog 的子类型。该列表将始终只包含狗或猫,但我不知道。

class MyClass {

    public readonly List<Animal> Data = new();

    public void MethodForDogs()
    {
        Data.Add(new Dog());
    }

    public void MethodForCats()
    {
        Data.Add(new Cat());
    }

    public void DoSomething()
    {
        HelperClass.DoIt(Data);
    }
}

class HelperClass {

    public static void DoIt(List<Animals> data) {

        if (data[0].GetType() == typeof(Cat) ) {
            var arrayCats = new Cat[data.Count];
            int i = 0;
            foreach (Animal item in data) {
                arrayCats[i++] = (Cat) item;
            }
            // use arrayCats
            ..
        }
        else if (data[0].GetType() == typeof(Dog) {
           // same, then use arrayDogs
           ..
        }
    }
}

什么不起作用是直接演员,比如

var arrayCats = (Cat[])data.ToArray();

即使我可以检查所有成员都是猫。有没有更优雅的方法来做到这一点?

某人

您可以通过以下方式执行此操作:

class HelperClass
{
    public static void DoIt(List<Animals> data)
    {
         if(data.All(a => a is Dog))
         {
              Dog[] dogs = data.OfType<Dog>().ToArray();
              // do something with dogs
         }
         else if(data.All(a => a is Cat))
         {
              Cat[] cats= data.OfType<Cat>().ToArray();
              // do something with cats
         }
         else
         {
            throw new ArgumentException("data must contain items of the same type");
         }
     }
}

使用All,您可以检查列表中的所有项目是否满足条件(在您的情况下为类型)。OfType()为您提供具有某种类型的所有项目(在您的情况下:所有项目)自动转换为该类型。如果列表是混合类型,该方法将抛出异常(当然,您可以使用另一种更适合您需要的错误处理)。

但您也应该考虑@AlphaDelta 的评论。对我来说,这个列表只包含一个子类型似乎有点奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

c - 如何将long转换为c中的数组?

如何将python列表转换为C中void类型的指针

如何将JSON数组转换为C#列表?

如何将 uint8_t 数组转换为 C 中的字符数组?

在 C# 中,如何将子类型与其父类型的引用进行比较?

如何将c#中的List转换为javascript .net core中的数组

如何将下面的json字符串转换为C#中的对象列表

如何将 json 转换为 c# 中的模型列表?

如何将JSON输出转换为c#对象并将其存储到数组中

如何将 txt 文件转换为浮点数组(在 C# 中)?

C如何将数组中的ASCII数字转换为文本

如何将数据存储在 char 数组中并在 C 中转换为 int

如何将2d数组转换为C中的矩阵?

将列表转换为C#中的数组

将向量或数组转换为C ++中的参数列表

将列表转换为C#中的int数组

如何将 PyObjects 转换为 C 数据类型?

您如何将超类型列表转换为子类型列表?

如何将字符串列表转换为 c# 中的浮点数列表,unity?

读取csv文件后如何将因子类型转换为R中的数字类型?

如何将具有混合子类型的嵌套子对象的对象转换为JS中的数组?

如何将分配给Object的c#基本类型数组转换为可以迭代的对象?

如何将目标c中的NSDictionary转换为Swift?

C#中如何将Json转换为对象

如何将父类型转换为子类型

如何将csv文件中的列表列表转换为numpy数组

如何从C#中的子类型树中声明属性的类型

在Python中,如何将数值数组列表转换为简单的一维numpy数组?

如何将numpy数组中的字符串列表转换为numpy数组