传递var类型的变量 - 未知类型

时间:2012-04-03 21:21:25

标签: c# variables lambda ienumerable var

我有以下代码行:

  

var groups = inputRows.GroupBy(x => new {x.stateCIP,x.facultyRank});

我想将组传递给另一个类方法:

OutputFileWriter.write(groups);

但是,我不知道为write方法声明输入参数的类型,因为它不会占用var。

public static void write(?????? groups)

我附上了鼠标悬停在var群组区域时收到的消息照片:enter image description here

5 个答案:

答案 0 :(得分:1)

一种方法是创建一个具有两个属性的类,即stateCIP和facultyRank,然后使用它而不是创建您现在正在执行的匿名类型。然后你可以将它而不是匿名类型传递给你的方法

所以代替 var groups = inputRows.GroupBy(x => new {x.stateCIP,x.facultyRank})

var groups = inputRows.GroupBy(x => new MyClass(StateCIP = x.stateCIP, FacultyRank = x.facultyRank });

然后你可以做

public static void write(IEnumerable<MyClass> groups)

或者如果你想对迭代它们的组对象做更多的事情,比如在Write方法中添加或删除组中的项目,那么在你调用方法时,使用以下方法将IEnumerable转换为List:

var groups = inputRows.GroupBy(x => new MyClass(StateCIP = x.stateCIP, FacultyRank = x.facultyRank }).ToList();

然后将您的方法写为

public static void write(IList<T> groups)

答案 1 :(得分:0)

也许是这样的:

public class MyObject
{
     public string stateCIP { get; set; }
     public string facultyRank { get; set; }
}

这样的电话:

var groups = inputRows.GroupBy(x => new MyObject()
{
    stateCIP= x.stateCIP,
    facultyRank= x.facultyRank
}).ToList();

然后像这样的功能:

public static void write(List<IGrouping<MyObject,YourTableEntity>> groups)
{
}

答案 2 :(得分:0)

像方法一样传递的解决方案就像

一样传递

IEnumerable

例如,你可以这样写:

public static void write(IEnumerable groups)

或者你可以模仿:

public static void write<T>(IEnumerable<T> groups)

答案 3 :(得分:0)

为了给予应有的信用,这是Tigran答案的增强。

您的查询返回IEnumerable<IGrouping<'a, InputRow>>,因此,如果您使用类型参数(此处为T)替换匿名类型,则您的方法通常可以接受。通过使用比IEnumerable<T>更具体的类型(Tigran的建议),您可以将序列的元素视为IGrouping对象:

public static void write<T>(IEnumerable<IGrouping<T, InputRow>> groups)
{
    foreach (var group in groups)
        foreach (var inputRow in group)
            //do something...
}

如果您不需要访问Key的成员(即匿名类型的实例),这将非常有效。在这里,您不需要它们,因为这些值也可以在InputRow类型中使用,如查询表达式所暗示的那样。

答案 4 :(得分:0)

如果您使用的是.NET 4.0,并且您不需要分组信息,因为它位于组中的各个项目中,您可以使用它:

public static void write(IEnumerable<IEnumerable<InputRow>> groups)