2013-04-15 7 views
3

Я разработчик SQL по профессии, поэтому Linq (и C# в целом) немного чуждо мне, тем не менее у меня есть простой цикл foreach, который, как я думаю, может быть лучше обслуживаться Linq-запрос. если ничего больше, это будет полезно узнать, даже если проблема не является сложной задачей. Вот мой код:Преобразование простого ForEach в оператор Linq

bool fireAgain = true; 
foreach (var connMan in Dts.Connections) 
{ 
    Dts.Events.FireInformation 
     (0 
      , "" 
      , String.Format("Connection Manager {0} has connection string {1}" 
      , connMan.Name 
      , connMan.ConnectionString) 
      , "" 
      , 0 
      , ref fireAgain 
     ); 
} 

Я могу понять:

from connMan in Dts.Connections select connMan 

достаточно легко, но как же я затем передать мой Connman в мой вызов метода FireInformation?

+0

'тем не менее, у меня есть простой для каждого цикла, который, как я думаю, лучше обслуживается запросом Linq'. Нет, я так не думаю. 'Dts.Connections.ToList(). ForEach (connMan => Dts.Events.FireInformation (.......));' – I4V

+2

linq обычно предназначен для извлечения/преобразования информации из сбор или источник данных, а не для выполнения логики ... поэтому мне интересно, подходит ли использование запроса linq. – Bubblewrap

+0

действительно используют LINQ там, где это не так - облегчите жизнь вам и вашим сопровождающим. LINQ имеет * запрос * как последнее слово в аббревиатуре, поэтому по умолчанию у них нет побочных эффектов. В вашем примере это неизбежно. –

ответ

5

В целом LINQ будет использоваться для запроса информации. В этом случае вы также запрашиваете информацию.

Что вы можете сделать, однако, следующее:

Dts.Connections.ForEach((conMan) => 
{ 
    Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain); 
} 

То есть, если Dts.Connections является список, в противном случае вы не можете сделать это. (не могу сказать из вашего вопроса, является ли это IEnumerable или List)

Обходным решением было бы создать метод расширения и использовать его в любом случае. Например:

public void ForEach<T>(this IEnumerable<T> source, Action<T> action) 
{ 
    foreach(T item in source) 
    { 
     action(item); 
    } 
} 

После этого вы можете использовать метод ForEach на вашем источнике, как показано в примере.

+0

IEnumerable не имеет расширения ForEach/ – I4V

+0

Я не мог сказать это из вопроса. Я обновил ответ, чтобы сделать его правильным для IEnumerable. – Kenneth

2
Dts.Connections 
    .ForEach(connMan => Dts.Events.FireInformation(0, "", String.Format("Connection Manager {0} has connection string {1}", connMan.Name, connMan.ConnectionString), "", 0, ref fireAgain)); 

Если Соединения не являются IEnumerable, измените первую строку;

Dts.Connections.ToList() 
+0

IEnumerable не имеет расширения ForEach/ – I4V

7

Я бы не предложил попробовать преобразовать это в Linq, потому что Linq предназначен для функционального программирования, а не для императива. Если вы хотите сравнить его с SQL, то это будет без DML.

Dts.Events.FireInformation, похоже, не возвращает значение, которое вы можете выбрать. Вероятно, он запускает событие или что-то еще, и он также использует параметр ref. Этот фрагмент кода совсем не похож на запрос, и я думаю, что его нельзя вставлять в него. Петля foreach в этом случае отлично подходит, поскольку вы на самом деле выполняете внутри нее работу и не запрашиваете данные (для чего нужен linq).

Если вам необходимо отфильтровать коллекцию на основе какого-либо условия, если вам нужно присоединиться к отдельным коллекциям или что-то в этом роде, то Linq может быть лучшим инструментом для работы.

+0

получил, это.Понятно, что это может быть так. Благодарю. – jamiet

Смежные вопросы