2012-04-03 1 views
2

У меня есть следующий код:Передача переменной типа вар - неизвестный тип

Var группы = inputRows.GroupBy (х => новый {x.stateCIP, x.facultyRank});

Я хочу передать группы в другой метод класса:

OutputFileWriter.write(groups); 

Однако, я не знаю, какой тип объявить входной параметр для метода записи, так как он не будет принимать вар.

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

Я приложил фотографию сообщения я получаю, когда я мыши над областью вар группы: enter image description here

+0

Как вы будете использовать «группы» внутри " написать "метод? – daniloquio

+0

Я буду перебирать его в цикле foreach, который имеет цикл sub-foreach для доступа к элементам по одной группе за раз. – Baxter

ответ

1

Одним из способов было бы создать класс с двумя свойствами, в stateCIP и facultyRank, а затем использовать что вместо того, чтобы создавать анонимный тип, который вы сейчас делаете. Затем вы можете передать, что вместо анонимного типа в ваш метод

так вместо Var группы = inputRows.GroupBy (х => {новый 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 в список с помощью:

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

, а затем написать свой метод как

public static void write(IList<T> groups) 
+0

Компилятор не любит ни один из этих параметров. – Baxter

+0

@baxter: Я понял, что в тот момент, когда я представил свой ответ. его обновлено сейчас. это должно сработать. – desigeek

0

Может быть что-то вроде этого:

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

The звонок такой:

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

И тогда функция, как это:

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

Решение передать как метод должен пройти как

IEnumerable

, например, вы можете написать что-то вроде этого:

public static void write(IEnumerable groups) 

или вы можете сделать это шаблоном:

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

+1 для вдохновения для моего ответа. Лучшей сигнатурой будет 'write (IEnumerable >)' – phoog

0

Чтобы отдать должное, когда это произойдет, это является усилением ответа Тиграна.

Ваш запрос возвращает IEnumerable<IGrouping<'a, InputRow>>, поэтому ваш метод может в принципе признать, что если вы замените анонимный тип параметром типа (здесь T). При использовании более конкретного типа, чем просто IEnumerable<T> (предложение Тиграна), вы получите лечить элементы последовательности в качестве объектов IGrouping:

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

Это будет работать очень хорошо, если вам не нужен доступ к членам из Ключ (т. Е. Экземпляры анонимного типа). И здесь они вам не понадобятся, поскольку эти значения также доступны в типе InputRow, что подразумевается выражением запроса.

0

Если вы используете .NET 4.0, и вам не нужна группировка информации, так как она находится в отдельных элементов, входящих в группу вы можете использовать это:

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