2016-08-13 4 views
2

j'ai ce morceau de code exécuté dans .net 3,5une alternative à Enumerable.First (System.Linq) C#

public const string SvgNamespace = "http://www.w3.org/2000/svg"; 
public const string XLinkPrefix = "xlink"; 
public const string XLinkNamespace = "http://www.w3.org/1999/xlink"; 
public const string XmlNamespace = "http://www.w3.org/XML/1998/namespace"; 

public static readonly List<KeyValuePair<string, string>> Namespaces = new List<KeyValuePair<string, string>>() 
{ 
    new KeyValuePair<string, string>("", SvgNamespace), 
    new KeyValuePair<string, string>(XLinkPrefix, XLinkNamespace), 
    new KeyValuePair<string, string>("xml", XmlNamespace) 
}; 

private bool _inAttrDictionary; 
private string _name; 
private string _namespace; 

public string NamespaceAndName 
     { 
      get 
      { 
       if (_namespace == SvgNamespace) 
        return _name; 
       return Namespaces.First(x => x.Value == _namespace).Key + ":" + _name; 
      } 
     } 

et je convertir à Framework 2.0 (élimination System.Linq). Comment puis-je maintenir la fonctionnalité de Enumerable.First Method (IEnumerable, Func) trouvé here dans mon code?

source complet file

+0

Qu'est-ce que _Namespaces_? Il n'y a pas de variable avec ce nom ici – Steve

+0

@Steve, il y a une liste public readonly statique > Namespaces' – Rahul

+0

@Rahul Je le vois maintenant, mais dans mon excuse, si vous regardez le code source dans le lien posté les choses deviennent vraiment déroutantes. – Steve

Répondre

1

Vous pouvez probablement utiliser une boucle foreach comme

foreach(var item in Namespaces) 
{ 
    if(item.Value == _namespace) 
    return item.Key + ":" + _name; 
} 
+0

Merci pour l'aide! – Robokitty

1

Vous pouvez créer la méthode GetFirst comme suit:

public string NamespaceAndName 
    { 
     get 
     { 
      if (_namespace == SvgNamespace) 
       return _name; 

      return GetFirst(Namespaces, _namespace).Key + ":" + _name; 
     } 
    } 
    private KeyValuePair<string, string> GetFirst(List<KeyValuePair<string,string>> namespaces,string yourNamespaceToMatch) 
    { 
     for (int i = 0; i < namespaces.Count; i++) 
     { 
      if (namespaces[i].Value == yourNamespaceToMatch) 
       return namespaces[i]; 
     } 
     throw new InvalidOperationException("Sequence contains no matching element"); 
    } 
1

Il n'y a pas vraiment une alternative à Enumerable.First, mais puisque vous avez effectivement une variable List<T>, vous pouvez envisager Find meth od. La signature est compatible avec le Enumerable.First, mais notez que le comportement est compatible avec Enumerable.FirstOrDefault, c'est-à-dire dans le cas où l'élément n'existe pas, vous obtiendrez NRE au lieu de la "Séquence ne contient aucun élément correspondant".

return Namespaces.Find(x => x.Value == _namespace).Key + ":" + _name; 
+0

J'aime aussi votre réponse. – Robokitty