首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较列表中的类型

比较列表中的类型
EN

Stack Overflow用户
提问于 2014-05-11 09:19:48
回答 2查看 64关注 0票数 0

我在Unity3D问答网站上问了一个类似的问题,但没有得到回应。我终于回到了这个项目,仍然有同样的问题。

与统一问题的链接

我已经搜索过了,但我认为我没有找到正确的关键字,因为我仍然没有找到一个合适的答案。无论如何,我会以不同的方式来问这个问题,希望有人能给我指明正确的方向。

下面是我想出的代码,它不是游戏中的实际代码,但它很好地展示了我的问题。

基本上,在build()方法中,我希望检查这两个列表都包含相同类型的工具,而不需要对该类型进行实际的硬编码。我不关心特定的工具实例,只是它是特定类型的。其目的是,我可以创建新的工具,而不必修改构建方法来合并这些新类型。

如果有更好的方法做这件事,我会全神贯注的。

谢谢

代码语言:javascript
运行
复制
namespace TypeExample
{
    class Tool
    {

    }

    class Spanner : Tool
    {

    }

    class Wrench : Tool
    {

    }

    class Builder
    {
        List<Tool> toolsAvailable = new List<Tool>();

        List<Tool> toolsRequired = new List<Tool>();

        public Builder()
        {
            Spanner spanner = new Spanner();
            Wrench wrench = new Wrench();

            toolsRequired.Add(spanner);
            toolsRequired.Add(wrench);
        }

        public void GiveTool(Tool tool)
        {
            toolsAvailable.Add(tool);
        }

        public void build()
        {
            // if true

            Console.WriteLine("Building");

            // else

            Console.WriteLine("I don't have the tools to build!");

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Spanner spanner = new Spanner();
            Wrench wrench = new Wrench();

            Builder builder = new Builder();

            builder.GiveTool(spanner);
            builder.GiveTool(wrench);

            builder.build();

            Console.ReadLine();
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-11 09:27:15

基本上,您应该使用林克从集合中获取所有类型,然后使用compair获取结果。

代码语言:javascript
运行
复制
var toolsAvailableTypes = toolsAvailable.Select(t => t.GetType()).Distinct();
var toolsRequiredTypes = toolsRequired.Select(t => t.GetType()).Distinct();
if (toolsRequiredTypes.Except(toolsAvailableTypes).Any())
{
    //building
}

目前尚不清楚,您是否也应补充仅限型号或数量的仪器。我的回答假设你不关心数量,当你需要两个spanner的时候,你可以用一个进行构建。

-Update

为了满足子类的要求(Sriram Sakthivel提到过),您可以检查可用的工具类型是否是必需的工具类型的子类,这样您就可以在需要SpecialSpanner时使用任何Spanner

代码语言:javascript
运行
复制
var toolsAvailableTypes = toolsAvailable.Select(t => t.GetType()).Distinct().ToList();
var toolsRequiredTypes = toolsRequired.Select(t => t.GetType()).Distinct().ToList();

if (CanBuild(toolsAvailableTypes, toolsRequiredTypes))
{
    Console.WriteLine("building");
}
else
{
    Console.WriteLine("not enough minerals");
}

CanBuild方法:

代码语言:javascript
运行
复制
bool CanBuild(List<Type> toolsAvailableTypes, List<Type> toolsRequiredTypes)
{
    foreach (var requiredType in toolsRequiredTypes)
    {
        bool isAvailable = toolsAvailableTypes.Any(availableType => availableType.IsSubclassOf(requiredType) || availableType == requiredType);
        if (!isAvailable)
        {
            return false;
        }
    }
    return true;
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-11 09:29:02

代码语言:javascript
运行
复制
var reqdTypes = toolsRequired.Select(x => x.GetType());
var availableTypes = toolsAvailable.Select(x => x.GetType());

if (reqdTypes.Except(availableTypes).Any())
{
    //Something exist in reqdTypes which is not in availableTypes
}

注意:如果提供比预期类型更多的派生类型,这将失败。例如,如果您提供SpecialSpanner就位或Spanner,这将无法工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23590891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档