6

在 Delphi 中,您可以执行以下操作:

TArray = array[1..3] of byte;

然后你可以在哪里声明

T2Array = array[1..3] of TArray

令人作呕...

.NET 中是否存在类似的东西?(VB,C#,无论)

我目前正在做这样的事情

Private LotsOfData As ObservableCollection(Of ObservableCollection(Of myClass))

但想做

Private LotsOfData As ObservableCollection(Of myType)

在哪里

myType -->  ObservableCollection(Of myClass)

我知道你可以用结构来做到这一点,即:

Public Structure MyType
     Public myOc as ObservableCollection(Of MyClass)
End Structure

Dim LotsOfData as ObservableCollection(of MyType)

但是您必须将其引用为(例如)

LotsOfData.Last.myOc(i) 

代替

LotsOfData.Last(i)

这看起来很笨拙。这似乎也很笨拙:

For Each Data as ObservableCollection(of myClass) in LotsOfData
     DoSomething(Data)
Next

一样

For Each Data as MyType in LotsOfData
     DoSomething(Data.myOc)
Next

什么时候可以

For Each Data as MyType in LotsOfData
     DoSomething(Data)
Next

有任何想法吗?

4

4 回答 4

5

如何定义派生自通用集合的封闭类型的自定义类?例如:

public class MyType : ObservableCollection<MyClass>
{ }

然后你可以创建另一个泛型集合,其类型参数是你上面定义的类(它本身就是一个集合):

ObservableCollection<MyType> lotsOfData = new ObservableCollection<MyType>();

当你迭代它时,你会得到内部集合的序列:

foreach (ObservableCollection<MyClass> data in lotsOfData)
{
    DoSomething(data);
}

编辑:如上所示的派生将允许您从基ObservableCollection<T>类继承所有可访问的成员,但您将无法调用其(非默认)构造函数。因此,您通常希望使用与基类相同的重载来实现构造函数:

public class MyType : ObservableCollection<MyClass>
{
    public MyType()
        : base()
    { }

    public MyType(IEnumerable<MyClass> collection)
        : base(collection)
    { }

    public MyType(List<MyClass> list)
        : base(list)
    { }
}
于 2012-04-05T20:47:22.843 回答
4

看起来您正在尝试在代码中创建类型别名。VB.Net 确实以Imports指令的形式支持它

Imports myType = System.Collections.Generic.ObservableCollection(Of myClass)

...

Private LotsOfData As ObservableCollection(Of myType)

请注意,Imports必须为您要使用的每个文件重复该指令myType

于 2012-04-05T20:42:53.177 回答
2

您可以在 .Net Delphi 语言 Oxygene 中定义类型别名。与经典 Delphi 的语法相同。

type
  MyType = ObservableCollection<MyClass>;

您可以使用public使名称在其他程序集中可见。

于 2012-04-05T21:06:18.747 回答
1

从 IEnumerable 开始,其中 T 是您正在操作的类型。有许多实现,包括List<T>允许您轻松排序、推送和弹出元素。

例如...

var myListOfThings = new List<Thing>(); 
myListOfThings.Add(new Thing {Name = "Green thing" }); 
myListOfThings.Add(new Thing { Name = "Red thing" }); 
myListOfThings.Add(new Thing { Name = "Yellow thing" });

当使用 IEnumerable 时,您可以访问LINQ ...

var redThing = myListOfThings.FirstOrDefault(x => x.Name == "Red Thing");

和简单的迭代......

foreach(var thing in myListOfThings)
{
     // do something
}

注意:我没有任何 VB 示例,但您使用 C# 标记了问题,所以我希望这些有用。

于 2012-04-05T20:42:29.850 回答