Можете ли вы заархивировать или использовать пользовательский оператор соединения в linq без выражений? - PullRequest
2 голосов
/ 02 февраля 2011

У меня есть несколько последовательностей, которые я хочу сжать более читабельным способом, чтобы я мог написать

a.Zip(b)

в синтаксисе запроса как

From a in Foo1
Join b in Foo2

без перекрестного соединения

или

From a in Foo1
Zip b in Foo2

1 Ответ

3 голосов
/ 02 февраля 2011

Стандартный метод Zip позволяет написать что-то вроде (используя C #):

from t in first.Zip(second, (f, s) => new { First = f, Second = s }
select ... t.First ... t.Second;

Я думаю, что это должно быть достаточно читабельным. Ваш вопрос предполагает, что вы хотели бы иметь возможность создать собственное ключевое слово, например, zip и расширьте выражения запроса C #, используя его. Это невозможно в C # или Visual Basic (но я согласен, что было бы неплохо).

С некоторыми усилиями вы можете переопределить того, что делает стандартная конструкция запроса C #, так что join будет вести себя как zip (В этом случае часть запроса equals не будет необходимо, чтобы у вас было много синтаксического шума). Возможно, вы также можете переопределить то, что from предложение. Я не пробовал, но я верю, что вы можете получить что-то вроде:

from f in first.Zip()
from s in second.AddToZip()
from t in second.AddToZip()
select ... f ... s ... t ...;

Я написал статью, в которой описывается, как это сделать переопределить для предложения group by ( Используя пользовательский оператор группировки в LINQ ), так что это может дать вам представление о том, как это осуществимо.

(Но, честно говоря, я думаю, что стандартный метод Zip должен быть в порядке. Переопределение операторов довольно тонкое. Пример group by может быть более привлекательным, потому что группировка с использованием метода более уродлива, но даже на край ...)

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