gpt4 book ai didi

c# - 用于计算列表中给定子类的出现次数的通用方法以及未找到 Type 参数的原因

转载 作者:行者123 更新时间:2023-11-30 23:33:27 24 4
gpt4 key购买 nike

我有一个 List<Doctor> doctors其中 Doctor是一个 abstract类。

在列表中我有子类,例如 DoctorJunior , DoctorSenior等等

如何计算特定子类的出现次数。

这有效 int count = doctors.Count(c => c is DoctorJunior);

然而,当我将它放在使用 Type 的方法中时作为参数,它不起作用。

public int GetOccurences(Type doctorType)
{
// return Passengers.OfType<doctorType>().Count();

// return doctors.Count(c => c is doctorType)

int count = 0;
foreach (Doctor doc in Doctors)
{
if (doc is doctorType)
{
count++;
}
}
return count;
}

参数doctorType找不到。

为什么参数是doctorType未找到,如何创建通用方法来计算类型?

谢谢

最佳答案

它不起作用的原因是 is 运算符仅在您将类型实例与类型本身进行比较时使用。您可以改用 doc.GetType() 并将此类型与存储在 doctorType 中的类型进行比较:

public int GetOccurences(Type doctorType)
{
int count = 0;
foreach (Doctor doc in Doctors)
if (doc.GetType() == doctorType) count++;

return count;
}

或者使用 LINQ:

public int GetOccurences(Type doctorType)
{
return Doctors.Count(d => d.GetType() == doctorType);
}

您甚至可以使用 Convert.ChangeType(obj, type); 来计数,但不推荐这样做:

    static int GetOccurences(IEnumerable<object> collection, Type t)
{
return collection.Count(item => { try { Convert.ChangeType(item, t); return true; } catch { return false; } });
}

或通用方法:

    static int GetOccurences<T>(IEnumerable<object> collection)
{
return collection.Count(item => item is T);
}

附言

值得注意的是,您的自定义类(例如 DoctorJunior)是类型(由您定义)但不是 System.Type

System.Type 是一个处理类型的类。

一个。正确

if(c is DoctorJunior) ...
  • 我们在这里使用 is 运算符,左侧是类实例,右侧是类名(不是 System.Type 类的实例)

B.不正确

Type t = typeof(DoctorJunior);
if(c is t) ...
  • 我们尝试使用is 运算符将类的实例System.Type 的实例进行比较。这是无效的,因为 is 运算符不能以这种方式工作。它只允许比较左侧的类实例和右侧的类型名称,例如 if(myVariable is Int32/string/MyClass/...)

关于c# - 用于计算列表中给定子类的出现次数的通用方法以及未找到 Type 参数的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33944052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com