C# 返回匿名2字符串类型的泛型列表的返回类型是什么?

C# 返回匿名2字符串类型的泛型列表的返回类型是什么?,c#,anonymous-types,C#,Anonymous Types,我有这个功能: public static List<string> JoinDataTablesMultipleColumns(DataTable dt1, DataTable dt2, string col1, string col2, string col3) { var multiJoin = from table1 in dt1.AsEnumerable() join table2 in dt2.AsEnumerable() on new { Col1 = ta

我有这个功能:

public static List<string> JoinDataTablesMultipleColumns(DataTable dt1, DataTable dt2, string col1, string col2, string col3) {
 var multiJoin = from table1 in dt1.AsEnumerable()
 join table2 in dt2.AsEnumerable()
 on new {
   Col1 = table1.Field < string > (col1),
   Col2 = table1.Field < string > (col2),
   Col3 = table1.Field < string > (col3),
 }
 equals new {
   Col1 = table2.Field < string > (col1),
   Col2 = table2.Field < string > (col2),
   Col3 = table2.Field < string > (col3),
 }
 select new {
   SeriesID = table1.Field < string > ("SeriesID"),
   CatID = table2.Field < string > ("CatID")
 };

 //if ( multiJoin != null )
 //   return multiJoin.ToList();
 //else
 return null;
}
公共静态列表JoinDataTablesMultipleColumns(数据表dt1、数据表dt2、字符串col1、字符串col2、字符串col3){
var multiJoin=来自dt1.AsEnumerable()中的表1
将表2连接到dt2.AsEnumerable()中
在纽约{
Col1=表1。字段<字符串>(Col1),
Col2=表1.字段<字符串>(Col2),
Col3=表1.字段<字符串>(Col3),
}
等于新的{
Col1=表2.字段(Col1),
Col2=表2.字段<字符串>(Col2),
Col3=表2.字段<字符串>(Col3),
}
选择新的{
SeriesID=table1.字段(“SeriesID”),
CatID=表2.字段(“CatID”)
};
//if(多连接!=null)
//返回multiJoin.ToList();
//否则
返回null;
}
它工作得很好,除了我有错误的返回类型。我编译和运行它的唯一方法是返回null。当我在返回并检查
监视窗口中的
multiJoin.ToList()
之前停止调试器时,它正是我想要的:


但是返回类型是错误的。我一直在尝试
列表
,但无法编译。也许是件简单的事,但我被卡住了。有什么想法吗?

与其尝试返回匿名类型(您不能为方法声明匿名返回类型),不如创建一个命名类型来保存数据:

public class Item
{
    public string SeriesID { get; set;}
    //...
}
并使用它,而不是当前在查询结束时选择的匿名类型

...select new Item {
   SeriesID = table1.Field < string > ("SeriesID"),
   CatID = table2.Field < string > ("CatID")
 };
…选择新项目{
SeriesID=table1.字段(“SeriesID”),
CatID=表2.字段(“CatID”)
};

正如您所注意到的,您将得到一个匿名类型的列表匿名类型的设计不是为了划掉创建它们的方法。有很多方法可以做到这一点,但它们令人困惑、困难和神秘

不要尝试对匿名类型执行此操作。在C#7中,可以使用元组类型并返回
列表
,然后执行以下操作

select (table1.Field<string>("SeriesID"), table2.Field<string>("CatID"))
select(表1.字段(“序列ID”)、表2.字段(“CatID”))

在C#的其他版本中,创建一个标称对类型并在select子句中创建它的实例。

当你说
创建一个标称对类型
时,这与
spender
的建议相同吗?我必须使用C#7,因为编译器不会抱怨
列表
,但它抱怨我返回的内容:
无法将type“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”
@HerrimanCoder:Hah,我在键入注释时键入了该问题的解决方案。按照元组路径,我可能会选择一个
列表
,使元组中返回的数据在方法调用的另一端易于使用。@spender:显然,这是我和其他人同时键入内容的日子。最后,这种方法可能比Eric的方法更老套,但是它不会像
元组那样使我丢失命名属性。如果我们有,这会更干净。它们是专门为解决这类问题而设计的。唉,它一直被推后。有大量低级别的实现细节,这使得我们很难为它制定一个规范。