【问题标题】:C# How to check if a List of interface objects contains a certain object? [duplicate]C#如何检查接口对象列表是否包含某个对象? [复制]
【发布时间】:2020-04-18 16:56:44
【问题描述】:

我的界面 Packageable 看起来像这样:

public interface Packageable
{
    double GetPrice(double modifier);
}

然后我有 4 个类,都继承自 Packageable,唯一的区别是价格。这些是游泳池、健身房、跳舞和台球,它们看起来像这样:

class Billiards : Packageable
{
    public double GetPrice(double modifier)
    {
        double price = 38;
        switch (modifier)
        {
            case 2:
                modifier = 0.7;
                break;
            case 3:
                modifier = 0.5;
                break;
            case 4:
                modifier = 0.35;
                break;
        }
        return price * modifier;
    }
}

最后,我有一个主类(其中的相关元素)如下所示:

public class People
{
    public List<Packageable> Packages = new List<Packageable>();
    public List<Packageable> ReturnPackages()
    {
        return Packages;
    }
}

在我的主表单中,我想检查列表 Packages 是否包含其中一个对象。这是我尝试的:

if (people[lbMain.SelectedIndex].ReturnPackages().Contains(SwimmingPool)) {}

但是,由于 SwimmingPool 是一种类型而不是对象,因此 Visual Studio 会引发错误。我试图通过为每个类创建一个对象来解决这个问题,但这也不起作用:

SwimmingPool swimmingpool = new SwimmingPool();
if (people[lbMain.SelectedIndex].ReturnPackages().Contains(swimmingpool)) {}

此代码运行,但从不返回 true。我该如何正确地做到这一点?

【问题讨论】:

  • 类似ReturnPackages().OfType&lt;SwimmingPool&gt;().Any()?
  • 这里提出了同样的问题:stackoverflow.com/questions/8216881/…
  • @vc74 这行得通!愿意做出完整的答复以更详细地解释它的工作原理吗?这样我也可以选择你的答案!

标签: c# list object


【解决方案1】:

您可以使用OfType 扩展方法返回集合中的元素,该集合继承自特定基类或实现特定接口。

结合Any 扩展方法(参数中不带谓词的方法),如果集合包含至少一个元素,则返回true,你会得到你想要的。

您还可以使用Any 覆盖,该覆盖采用@Mureinik 建议的参数中的谓词。

【讨论】:

    【解决方案2】:

    您可以将Any 与检查类型的 lambda 表达式一起使用:

    if (people[lbMain.SelectedIndex].ReturnPackages()
                                    .Any(p => p.GetType() == typeof(SwimmingPool))) 
    {
        // do something...
    }
    

    【讨论】:

    • 简化版:if (people[lbMain.SelectedIndex].ReturnPackages().OfType().Any()) {}
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2022-11-09
    • 2017-08-10
    • 2011-04-02
    相关资源
    最近更新 更多