c# - 具有多种类型的列表

标签 c# .net

在 C# 中,有没有办法创建一个 list拥有多种类型?我的列表项可以是 int , string , DateTime , 或 char .我知道使用 List<object>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;
    }
}

关于c# - 具有多种类型的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494850/

相关文章:

c# - 来自Httpresponse的字符串未传递完整值

c# - WPF 保存网页浏览器 HTML

c# - 如何根据 DataPropertyName 列访问 DataRowView 中的单元格?

C#6.0 字符串插值本地化

c# - SMO ServerConnection 事务方法与使用 SqlConnectionObject 属性有区别吗?

c# - 以编程方式设置 IIS 6.0 的服务器绑定(bind)

c# - T-SQL 具有 `time` 数据类型——C# 是否只有 `time` 而不是 `datetime` 数据类型?

c# - ASP.Net弹性搜寻

c# - 大型数据集上的 System.Numerics.Vector<T>

.net - 如何解决 SQL Server Compact Edition 数据库上 LINQ to SQL 中的 "Row not found or changed"异常?