Lucene.Net  3.0.3
Lucene.Net is a port of the Lucene search engine library, written in C# and targeted at .NET runtime users.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Pages
Extensions.cs
Go to the documentation of this file.
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements. See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License. You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 using System;
19 using System.Collections.Generic;
20 using System.Linq;
21 using System.Text;
22 
23 namespace Lucene.Net.Search
24 {
25  public static class Extensions
26  {
27  //CartesianProduct - Lambda
28  public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IList<T>> sequences)
29  {
30  IEnumerable<IEnumerable<T>> emptyProduct = new IEnumerable<T>[] { Enumerable.Empty<T>() };
31  return sequences.Aggregate(
32  emptyProduct,
33  (accumulator, sequence) =>
34  {
35  return accumulator.SelectMany(
36  (accseq => sequence),
37  (accseq, item) => accseq.Concat(new T[] { item })
38  );
39  }
40  );
41  }
42 
43  //CartesianProduct - Lambda
44  public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
45  {
46  IEnumerable<IEnumerable<T>> emptyProduct = new IEnumerable<T>[] { Enumerable.Empty<T>() };
47  return sequences.Aggregate(
48  emptyProduct,
49  (accumulator, sequence) =>
50  {
51  return accumulator.SelectMany(
52  (accseq => sequence),
53  (accseq, item) => accseq.Concat(new T[] { item })
54  );
55  }
56  );
57  }
58 
59  //CartesianProduct - LINQ
60  //http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
61  static IEnumerable<IEnumerable<T>> CartesianProduct2<T>(this IEnumerable<IEnumerable<T>> sequences)
62  {
63  IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
64  return sequences.Aggregate(
65  emptyProduct,
66  (accumulator, sequence) =>
67  from accseq in accumulator
68  from item in sequence
69  select accseq.Concat(new[] { item }));
70  }
71  }
72 }