2012-09-18 19 views

Respuesta

10

Si tiene las listas originales de las que provienen las búsquedas, podría ser más fácil. También podría ser más fácil si usó Dictionary s de Lists en lugar de búsquedas. Sin embargo, aún es posible fusionar dos objetos de búsqueda en un nuevo objeto. La idea básica es recuperar los valores originales de las búsquedas y luego crear una nueva búsqueda del conjunto concatenado de ambos.

var a = new[] {"apple","aardvark","barn"}; 
var b = new[] {"baboon", "candy", "cork"}; 

var al = a.ToLookup (x => x[0]); 
var bl = b.ToLookup (x => x[0]); 

var cl = al.Concat(bl).SelectMany(x => x).ToLookup(x => x[0]); 

Si no conoce la función de selector de llave original, puede usar esta variante.

var cl = al.Concat(bl) 
    .SelectMany(lookup => lookup.Select(value => new { lookup.Key, value})) 
    .ToLookup(x => x.Key, x => x.value); 
+0

¿Qué pasa si no tengo referencias a cualquiera de las colecciones utilizadas en la creación LookUp? – myWallJSON

+0

Luego puede usar el código que publiqué. – recursive

+0

Estoy tratando de hacer lo mismo que el OP sin embargo, el código anterior no me ayuda, el hecho de que esté repitiendo la definición de KeySelector en lugar de usar grouping.Key para crear las búsquedas. Esperaba un código más genérico utilizando las claves de cada búsqueda entrante. –

0

se puede considerar una forma más flexible para cualquier recuento de matriz/lista. Por ejemplo, cree las operaciones de búsqueda de sinónimo:

public ILookup<string, string> GetSynonyms() 
{ 
    var data = new[] 
     { 
      new[] {"hello", "hi there", "привет"}, 
      new[] {"bye", "Tchau", "Adios"}, 
      new[] {"hello", "hi there"} 
     }; 

    return data 
     .SelectMany(words => words.SelectMany(
      keyWord => words.Where(word => word != keyWord).Select(word => new Tuple<string, string>(item1: keyWord, item2: word)))) 
     .Distinct(comparer: new DelegateComparer<Tuple<string, string>>(equals: Equals, hashCode: v => v.GetHashCode())) 
     .ToLookup(keySelector: k => k.Item1, elementSelector: e => e.Item2); 
} 

public sealed class DelegateComparer<T> : IEqualityComparer<T> 
{ 
    private readonly Func<T, T, bool> _equals; 
    private readonly Func<T, int> _hashCode; 

    public DelegateComparer(Func<T, T, bool> equals, Func<T, int> hashCode) 
    { 
     _equals = equals; 
     _hashCode = hashCode; 
    } 

    public bool Equals(T x, T y) 
    { 
     return _equals(x, y); 
    } 

    public int GetHashCode(T obj) 
    { 
     return _hashCode != null ? _hashCode(obj) : obj.GetHashCode(); 
    } 
} 

result of execution

Cuestiones relacionadas