2013-06-04 5 views
3

J'utilise Unity3D, Mono, C# sous Mac OSX 10.8. J'essaie d'utiliser .Net Enumerable.Zip. Mais copier-coller l'exemple MSDN me donne une erreur cs0117.CS1061, CS0117: `System.Linq.Enumerable 'ne contient pas de définition de` Zip'

exemple minimal ne fonctionne pas:

using UnityEngine; 
using System.Collections; 
using System.Linq; 

public class Asteroids : MonoBehaviour { 
void Start() { 
    int[] numbers = { 1, 2, 3, 4 }; 
    string[] words = { "one", "two", "three" }; 
    var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second); 
} 
} 

Message d'erreur:

erreur CS1061: Type int[]' does not contain a definition for Zip et aucune méthode d'extension Zip' of type int [] »pourrait être trouvée (êtes-vous manquantes une directive d'utilisation ou une référence d'assemblage?)

I essayé de remplacer "numbers.Zip" par "Enumerable.Zip", puis je suis arrivé ceci:

erreur CS0117: System.Linq.Enumerable' does not contain a definition for Zip

Pourquoi ces happend?

Répondre

6

Zip() est nouveau .NET 4. (contrairement au reste de LINQ, qui a été introduit en .Net 3.5)

Il ressemble à votre version de Mono ne l'a pas.

7

Compte tenu de la réponse de @SLaks, il est facile de rouler votre Zip:

public static IEnumerable<TResult> Zip<TA, TB, TResult>(
    this IEnumerable<TA> seqA, IEnumerable<TB> seqB, Func<TA, TB, TResult> func) 
{ 
    if (seqA == null) throw new ArgumentNullException("seqA"); 
    if (seqB == null) throw new ArgumentNullException("seqB"); 

    using (var iteratorA = seqA.GetEnumerator()) 
    using (var iteratorB = seqB.GetEnumerator()) 
    { 
     while (iteratorA.MoveNext() && iteratorB.MoveNext()) 
     { 
      yield return func(iteratorA.Current, iteratorB.Current); 
     } 
    } 
} 
Questions connexes