我有这个功能:
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()
时,这正是我想要的:
但是返回类型错误。我一直在尝试watch window
,但是无法编译。可能很简单,但是我被困住了。有什么想法吗?
答案 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")
};