Какой самый дешевый способ выполнить LINQ-запрос немедленно - PullRequest
2 голосов
/ 26 января 2012

Этот вопрос возник у меня во время генерации образцов данных для SO-ответа.Мне не нравится подробный способ добавления DataRows один за другим с помощью Tbl.Rows.Add, поэтому я создал этот псевдо-LINQ-запрос, который ничего не делает, кроме неявного добавления строк:

Private Function GetData() As DataTable
    Dim years = {"2010/2009", "2009/2008", "2008/2007", "2007/2006", "2006/2005", "2005/2004", "2004/2003"}
    Dim tbl = New DataTable
    tbl.Columns.Add(New DataColumn("Year"))
    ' adds DataRows to the DataTable, need Count to execute the query '
    Dim c = (From y In years Select tbl.Rows.Add(y)).Count 
    Return tbl
End Function

Как вы можете видеть, ярезультат запроса вообще не нужен, его единственная цель - выполнить итерацию и вызвать DataTable.Rows.Add.Таким образом, результат уже доступен в самой DataTable и не нужен в запросе.

По общему признанию, этот вопрос несколько гипотетичен, поскольку не было бы большой разницы в использовании fe ToList, и обычно целью запроса являетсявернуть что-то.

Но в любом случае, какой самый дешевый способ (с точки зрения потребления памяти, времени выполнения) выполнить запрос LINQ, когда имеет значение только выполнение, а не результат?

Редактировать : Хорошо, этот вопрос был быстрым решением проблемы курицы и яйца.Я хотел сократить 20 строк кода до одной строки, но заметил, что мне нужен какой-то источник данных для LINQ-запроса.Для этого я создал массив.Но в этот момент я мог бы просто использовать цикл for-each, чтобы добавить DataRows.

Заключение : используйте запрос LINQ для того, для чего он предназначен: запрос .Тогда этот вопрос не имеет смысла, так как нет самого дешевого пути, а есть только тот, который возвращает правильный результат.

Ответы [ 2 ]

9 голосов
/ 26 января 2012

Я бы просто переписал это как foreach:

For Each y As String in years
    tbl.Rows.Add(y)
Next

Гораздо яснее, каково ваше намерение таким образом, и оно выполняется сразу.

2 голосов
/ 26 января 2012

Я бы более склонен использовать List(Of T):

Dim years As New List(Of String) From {"2010/2009", "2009/2008", "2008/2007", "2007/2006", "2006/2005", "2005/2004", "2004/2003"}

years.ForEach(Sub(y) tbl.Rows.Add(y))

Хотя все это субъективно, петли, вероятно, наиболее понятны для этих лайнеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...