Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有可能有一个不同结构的列表吗?_C#_List_Types_Struct - Fatal编程技术网

C# 有可能有一个不同结构的列表吗?

C# 有可能有一个不同结构的列表吗?,c#,list,types,struct,C#,List,Types,Struct,我想制作一个列表,在其中我可以放置多个不同的结构。问题是我不能给List模板参数,因为结构没有公分母(并且结构的继承是不可能的)。我的意思是: struct Apple { float roundness; float appleness; } struct Orange { float orangeness; bool isActuallyAMandarin; } List<???> fruitBasket; void Main(string []

我想制作一个
列表
,在其中我可以放置多个不同的结构。问题是我不能给
List
模板参数,因为结构没有公分母(并且结构的继承是不可能的)。我的意思是:

struct Apple
{
    float roundness;
    float appleness;
}

struct Orange
{
   float orangeness;
   bool isActuallyAMandarin;
}

List<???> fruitBasket;

void Main(string [] args)
{
    fruitBasket = new List<???>();
    fruitBasket.Add( new Apple());
    fruitBasket.Add( new Orange());
}
struct苹果
{
浮动圆度;
浮动适用性;
}
结构橙
{
浮橙;
布尔是真正的亚曼达林;
}
列出果篮;
void Main(字符串[]args)
{
果篮=新列表();
添加(新苹果());
果篮。添加(新橙色());
}
由于明显的原因,忽略列表的模板参数会导致错误:

Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments
使用泛型类型“System.Collections.generic.List”需要1个类型参数
有没有办法做到这一点?可能使用
列表
,或者使用不需要类型参数的数组或其他集合类


编辑:这个问题专门针对结构,而不是类。我完全知道这可以通过类和继承来解决,但我不能自由地使用类来代替(第三方库问题…。

每个结构都有一个类作为基础:它是
对象
,所以你可以把它放在

  List<Object> fruitBasket;
列出果篮;
但这意味着将列表中的每个结构装箱。另一种可能性是

  List<ValueType> fruitBasket;
列出果篮;

如果
struct
不是您唯一的选择,您应该尝试使用继承:

abstract class Fruit {
}

class Apple : Fruit {
}

class Orange : Fruit {
}

List<Fruit> fruits = new List<Fruit>();
fruits.Add(new Apple());
抽象类水果{
}
苹果类:水果{
}
橙色类:水果{
}
列表水果=新列表();
添加(新苹果());

等等

虽然你的问题已经得到了回答,但我建议你也去看看StackOverflow的帖子。这会让你明白很多事情

在C#中,您可以使用接口实现类似于值类型多态性(struct)的功能,因为您不能直接从struct派生,但可以让多个struct类型实现特定的接口


因此,您可以使用接口IFruits,而不是抽象结构Fruit。

没问题。你只需要列出一个对象列表。您可以使用老式的非泛型ArrayList,就像我们在.NET1.x的旧时代所做的那样,也可以使用泛型列表。它之所以有效,是因为对象是一切事物的根

void Main(string [] args) {
  var fruitBasket = new List<Object>();
  fruitBasket.Add( new Apple());
  fruitBasket.Add( new Orange());
}

另一个问题是将内容从列表中删除,但您没有问这个问题,是吗?

您可以在这里使用接口

public interface IFruit {}

Apple : IFruit {...}

Orange : IFruit {...}

List<IFruit> list = new List<IFruit>();
list.Add(new Apple());
list.Add(new Orange());
公共接口IFruit{}
苹果:IFruit{…}
橙色:IFruit{…}
列表=新列表();
添加(新苹果());
添加(新的橙色());

尽管如此,它仍然会导致装箱操作(接口为引用类型)

另一种尚未提及的可能性是定义一个包含足够字段的结构,以封装任何所需结构可能包含的所有值,以及确定如何解释这些值的方法。例如:

结构AppleOrOrange { 浮苹果酸橙黄; 内圆度或标准度; }

由于在
float
上的任何操作都不会产生某些位模式,因此可以为普通话和非普通话的橙子保留两个位模式,并说如果
roundness或mandarinness
持有其中一个位模式,则元素应视为橙色;它持有另一个,值应按位转换为
浮点
,元素视为苹果。请注意,在这种特殊情况下,与装箱相比,这种方法将大大节省内存需求(装箱将使x86[20 vs 8]中的存储需求增加一倍以上,而在x64[32 vs 8]中则增加四倍以上)

如果大多数项目都很简单,但也有一些项目比较复杂,那么另一种方法是使用一个结构,其中包含“简单”项目的数据以及补充信息的引用类型。例如,如果有一个绘图操作列表,最常见的是“moveto”或“lineto”,其中每个操作只需要一个
x
y
,但某些操作需要更多信息,则可以定义一个结构:

structure DrawListEntry {public int X,Y; public DrawOperation Op;}

对于
moveto
lineto
条目,
op
将包含对单例的引用;对于像
ShowBitmap
这样的条目,它可以包含对封装任意附加信息的非单例对象的引用。如果90%的图形条目是“moveto”或“lineto”,则此方法将需要12或16个字节(而不是24或32个字节)。将大多数参赛作品的存储成本削减一半将是一个巨大的胜利。此外,
var it=myList[index]的缓存性能;it.Op.Draw(it.X,it.Y)
,在90%的时间里用
it.Op
标识两个单例中的一个,可能比在完全独立的对象实例上调用
it.Draw()
要好。

@rosko结构类型不能继承其他类型,它们只能实现接口,从长远来看,这与装箱到
对象
一样好,只有接口成员的潜在好处。如果我错了,请纠正我的错误,但是:结构不支持继承。正如@DmitryBychenko所说,您可以拥有
列表
,但这将产生装箱开销。您可以拥有列表,也可以拥有非泛型列表。但是这两种方法都涉及到装箱/拆箱,您想使用结构的具体原因是什么?为什么不使用类?你能澄清一下拳击的含义吗?这是不是很糟糕,比如额外的内存开销或其他什么?这意味着你将不得不与另一个开发人员进行竞争ring@Yellow:我不知道为什么downvote,也许他不知道在这里使用类和继承会更好。。。?正如我所说,如果不是必须使用结构,这可能是有效的解决方案。这有什么帮助<代码>苹果
structure DrawListEntry {public int X,Y; public DrawOperation Op;}