我希望不可变的匿名类型具有可以传递,比较和识别的命名成员 - 元组和匿名类型的合并.这不存在,我意识到这一点.
所以问题是:使用C#4或5,这是一个很好的惯用替代品吗?
用例是来自异构数据源的流畅的LINQ数据处理.总之,C#中的ETL.我做了一些非常复杂的分析,数据来自多个平台和来源.它不是"只需将它们放在同一平台上并使用实体框架"的选项.我希望能够流畅地传递基本上任意的记录 - 不可变命名的只读属性集.
我唯一能想到的就是为每个单独的匿名类型创建一个自定义的不可变POCO,就是使用属性将编译的注释添加到返回Tuples的方法中.当然,编写用于吐出不可变POCO的代码生成器并不困难,但我讨厌如何混淆项目的对象模型.使用dynamic完全消除静态类型的所有性能和设计时有用性,特别是如果从其他方法的结果组成进一步的查询,所以我不认为它是一个可行的解决方案.
// My idea: Adding a attribute to methods to at least record the names
// of the "columns" of a Tuple at a method level
public class NamedTupleAttribute : Attribute {
public string[] Names { get; private set; }
public NamedTupleAttribute(string[] Names) { this.Names = Names; }
}
// Using NamedTuple attribute to note meaning of members of Tuple
[NamedTuple(new[] { "StoreNumber", "Gross", "Cost", …Run Code Online (Sandbox Code Playgroud) 在C#(7+)中,我可以声明(在Tuple类中比在"Item1","Item2"中更好地命名)
var myList = new List<(int first, int second)>();
Run Code Online (Sandbox Code Playgroud)
然后参考项目:
var a = myList[0].second;
Run Code Online (Sandbox Code Playgroud)
VB.NET中有相同的语法吗?
编辑 从Andrew Morton的回答,等效语法是:
Dim myList = New List(Of (first As Integer, second As Integer))
Dim a = myList(0).second
Run Code Online (Sandbox Code Playgroud)