public static IEnumerable<TResult> Cartesian<T1, T2, T3, TResult>(
	this IEnumerable<T1> first,
	IEnumerable<T2> second,
	IEnumerable<T3> third,
	Func<T1, T2, T3, TResult> resultSelector
)
<ExtensionAttribute>
Public Shared Function Cartesian(Of T1, T2, T3, TResult) ( 
	first As IEnumerable(Of T1),
	second As IEnumerable(Of T2),
	third As IEnumerable(Of T3),
	resultSelector As Func(Of T1, T2, T3, TResult)
) As IEnumerable(Of TResult)public:
[ExtensionAttribute]
generic<typename T1, typename T2, typename T3, typename TResult>
static IEnumerable<TResult>^ Cartesian(
	IEnumerable<T1>^ first, 
	IEnumerable<T2>^ second, 
	IEnumerable<T3>^ third, 
	Func<T1, T2, T3, TResult>^ resultSelector
)[<ExtensionAttribute>]
static member Cartesian : 
        first : IEnumerable<'T1> * 
        second : IEnumerable<'T2> * 
        third : IEnumerable<'T3> * 
        resultSelector : Func<'T1, 'T2, 'T3, 'TResult> -> IEnumerable<'TResult> The method returns items in the same order as a nested foreach loop, but all sequences except for first are cached when iterated over. The cache is then re-used for any subsequent iterations.
This method uses deferred execution and stream its results.