返回匿名2字符串类型的通用列表的返回类型是什么?

时间:2018-11-08 00:23:54

标签: c# anonymous-types

我有这个功能:

BRACKET_PAIRS = { '[' => ']', '{' => '}', '(' => ')' }

def valid?(string)
  string.each_char.with_object([]) do |char, bracket_stack|
    if BRACKET_PAIRS.keys.include? char
      bracket_stack << char
    elsif BRACKET_PAIRS.values.include? char
      if char != BRACKET_PAIRS[bracket_stack.last]
        return false
      else
        bracket_stack.pop
      end
    end
  end.empty?
end

除了我返回的类型错误外,它的工作原理非常完美。我可以编译和运行它的唯一方法是返回null。当我在返回之前停止调试器并检查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; } 中的multiJoin.ToList()时,这正是我想要的:

enter image description here

但是返回类型错误。我一直在尝试watch window,但是无法编译。可能很简单,但是我被困住了。有什么想法吗?

2 个答案:

答案 0 :(得分:12)

您注意到,您将获得匿名类型的列表。 匿名类型的设计不旨在消除创建匿名类型的方法。有多种方法可以使该工作正常进行,但它们却令人困惑,困难且不可思议。

请勿尝试使用匿名类型执行此操作。在C#7中,您可以使用元组类型并返回List<(string, string)>,然后执行

select (table1.Field<string>("SeriesID"), table2.Field<string>("CatID"))

在其他版本的C#中,创建名义对类型,并在select子句中创建它的实例。

答案 1 :(得分:5)

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

public class Item
{
    public string SeriesID { get; set;}
    //...
}

并使用它代替查询结束时当前选择的匿名类型。

...select new Item {
   SeriesID = table1.Field < string > ("SeriesID"),
   CatID = table2.Field < string > ("CatID")
 };