具有多种类型的列表

2024-03-19

在C#中,有没有办法创建一个list拥有多种类型?我的列表项可以是int, string, DateTime, or char。我知道使用List<object> or ArrayList但由于封装的原因,这些都不是好的做法。有没有一个好的方法来实现这一目标?我认为创建一个界面可能会有所帮助,但我找不到办法。


我想出了第二种但不同的方法(可能在其他答案中描述,但现在在这里实现),这次利用隐式操作,并且还能够使用框架列表类型:

void Main()
{
    var list = new List<Item>
    {
        1,
        "foo",
        DateTime.Now,
        'x'
    };
    foreach (var item in list)
    {
        Console.WriteLine (item.ToString());
    }
    int i = list[0];
    string s = list[1];
    DateTime dt = list[2];
    char c = list[3];
    Console.WriteLine ("int: {0}, string: {1}, DateTime: {2}, char: {3}", i, s, dt, c);
}

enum Kind
{
    Int,
    String,
    DateTime,
    Char
}

class Item
{
    int intValue;
    string stringValue;
    DateTime dateTimeValue;
    char charValue;
    Kind kind;

    public object Value
    {
        get
        {
            switch (kind)
            {           
                case Kind.Int:
                    return intValue;
                case Kind.String:
                    return stringValue;
                case Kind.DateTime:
                    return dateTimeValue;
                case Kind.Char:
                    return charValue;
                default:
                    return null;
            }

        }
    }

    public override string ToString()
    {   
        return Value.ToString();
    }

    // Implicit construction
    public static implicit operator Item(int i)
    {
        return new Item { intValue = i, kind = Kind.Int };
    }
    public static implicit operator Item(string s)
    {
        return new Item { stringValue = s, kind = Kind.String };
    }
    public static implicit operator Item(DateTime dt)
    {
        return new Item { dateTimeValue = dt, kind = Kind.DateTime };
    }
    public static implicit operator Item(char c)
    {
        return new Item { charValue = c, kind = Kind.Char };
    }

    // Implicit value reference
    public static implicit operator int(Item item)
    {
        if(item.kind != Kind.Int) // Optionally, you could validate the usage
        {
            throw new InvalidCastException("Trying to use a " + item.kind + " as an int");
        }
        return item.intValue;
    }
    public static implicit operator string(Item item)
    {
        return item.stringValue;
    }
    public static implicit operator DateTime(Item item)
    {
        return item.dateTimeValue;
    }
    public static implicit operator char(Item item)
    {
        return item.charValue;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有多种类型的列表 的相关文章

随机推荐

  • 如何使用ActionBar 夏洛克?

    如何在 Android 应用程序中使用操作栏 sherlock 我已经尝试过该网站 但没有成功 我想要一个背景图像 将应用程序名称居中 操作栏中没有图标 我尝试过这段代码 http tinyurl com pguqag5以及中的例子这个链接
  • 枚举的单独类? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 git 存储库向下移动到层次结构级别

    我现在已经搜索了几个小时 但找不到令人满意的答案 尽管这似乎是一个简单的新手问题 我基本上想要完成的是将当前位于项目文件夹旁边的 git 目录移动到项目文件夹中 最好这根本不应该改变存储库历史记录 尽管我不知道这实际上是否可能 我想这样做的
  • Scrapy 中每个项目有多个页面

    免责声明 我对 Scrapy 还很陌生 简单地提出我的问题 如何从页面上的链接检索 Item 属性并将结果返回到同一个 Item 中 给出以下示例 Spider class SiteSpider Spider site loader Sit
  • Azure 函数服务总线输出消息属性

    我正在尝试使用服务总线绑定输出在 JavaScript Azure 函数中设置服务总线消息的元数据 不幸的是 绑定似乎只支持身体 查看文档 我发现您可以通过以下方式在服务总线触发器中访问此信息context bindingData但我没有看
  • 用 ImageMapType、Tile 边界框替换 Google 地图 v3 中的 GTileLayer?

    我需要更新这段代码 radar layer getTileUrl function tile zoom var llp new GPoint tile x 256 tile y 1 256 var urp new GPoint tile x
  • 自动启动android服务

    如何在Android 3 x中自动启动服务 测试平板电脑是三星Galaxy 10 1 我的代码可以在带有 android 2 2 1 的无名平板电脑上运行该代码也可以在带有 android 版本 3 x 的 android 模拟器中运行 C
  • 如何从 VirtualBox 中修改 /etc/hosts

    我有一个应用程序 我必须更改它 etc hosts文件才能命中 这是我的新文件 127 0 0 1 localhost 127 0 0 1 local connectwithme 这在我的本地机器上很容易工作 我只是去local conne
  • Android Retrofit enqueue方法没有返回值

    fun getSurvey MutableList
  • Outlook 对象模型 - 连接到对话清理功能

    Outlook 2010 有一个功能称为对话清理 http office microsoft com en us outlook help use conversation clean up to eliminate redundant m
  • .Net:DataGridView 响应 IBinding.ListChanged 但不响应 CellValueChanged 事件处理程序

    我有一个自定义 IBinding 列表 它会引发 ListChanged 事件 我想在 ListChanged 事件之后重新着色 Datagridview 行 Datagridview 响应 ListChanged 事件并更改单元格值 但从
  • 允许将 Woocommerce 中特定产品类别的最多 3 个产品添加到购物车

    我尝试向免运费的客户发送最多 3 个免费样品 我创建了一些 0 价产品并将它们设置在 样品 产品类别中 该特定产品可以选择 单独出售 因此客户只能购买每个样品之 一 我不知道如何在购物车上只允许最多包含该产品类别的 3 个样品产品 任何帮助
  • 查找具有两个精确预定义差异的对应字符串的同位素

    我有一个名称向量 求和公式 例如 C 4 H 15 O 7 C 13 H 17 O 7 C 3 Cxiv 1 H 15 O 7 C 12 Cxiv 1 H 17 O 7 C 24 H 15 O 4 C 32 H 13 O 10 C 12 C
  • 将 Seq[Either[String, Int]] 转换为 (Seq[String], Seq[Int]) 的有效和/或惯用方法

    稍微简化一下 我的问题来自字符串列表input我想用函数解析parse返回Either String Int Then list map parse 返回一个列表Eithers 程序的下一步是格式化总结所有错误的错误消息or传递已解析的整数
  • QSlider 和按键事件

    我目前有一个 QSlider 可以使用鼠标滚动图像数据帧 我希望能够使用箭头键滚动单个步骤 一帧 这是我当前的 sliderMoved 代码 def sliderMoved self val retrieves the data array
  • 子对象的 MVC 模型绑定命名约定?

    当存在子属性时 我在默认模型绑定命名约定方面遇到问题 例如 我有一个 ViewModel 看起来像这样 public class UserViewModel public User BusinessObject get set 我的 Use
  • 应该避免在 C/C++ 中使用递归调用吗?

    是否应该避免在 C C 中使用函数的递归调用 我从事机器学习 数据挖掘工作 因此使我的代码具有可扩展性对我来说非常重要 当我使用Java时 我尽可能避免使用递归调用 因为我经常会导致调用堆栈溢出 尽管有一些选项可以控制分配给调用堆栈的内存量
  • 连接到生产者时出错:错误:ssl.certificate.location 失败

    环境信息 操作系统 例如Mac Arch Windows 10 Windows10 节点版本 例如8 2 1 10 4 1 NPM 版本 例如5 4 2 6 4 1 节点 rdkafka版本 例如2 3 3 2 5 1 重现步骤 节点 rd
  • 我可以在 Rails 中有一个名为“Transaction”的模型吗?

    我们希望有一个名为 Transaction 的模型 它与 Rails 中数据库的 交易 表相对应 但这会与现有的 ActiveRecord 交易功能发生冲突 除了为事务模型起一个不同的名称 我不想这样做 之外 我还能做些什么来支持该模型吗
  • 具有多种类型的列表

    在C 中 有没有办法创建一个list拥有多种类型 我的列表项可以是int string DateTime or char 我知道使用List or ArrayList但由于封装的原因 这些都不是好的做法 有没有一个好的方法来实现这一目标 我