2016-08-13 6 views
2

У меня есть этот кусок кода работает в .net 3.5альтернатива 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; 
      } 
     } 

и я в настоящее время преобразовав его в .net 2.0 (удаление System.Linq). Как я могу поддерживать функциональность Enumerable.First Method (IEnumerable, Func) нашел here в моем коде?

Полный источник file

+0

Что такое _Namespaces_? Здесь нет переменной с этим именем – Steve

+0

@Steve, есть один открытый публичный статический readonly List > Пространства имен – Rahul

+0

@Rahul Я вижу это сейчас, но, по моему оправданию, если вы посмотрите на исходный код в размещенной ссылке все становится очень запутанным. – Steve

ответ

1

Вы можете, вероятно, использовать foreach цикл вроде

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

Спасибо за помощь! – Robokitty

1

Вы можете создать метод GetFirst следующим образом:

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

Это на самом деле не является альтернативой Enumerable.First, но так как у вас есть переменная List<T>, вы можете рассмотреть Find meth обмундирование оливково-серого цвета Подпись совместима с Enumerable.First, но обратите внимание, что поведение совместимо с Enumerable.FirstOrDefault, то есть в случае, если элемент не существует, вы получите NRE вместо «Последовательность не содержит соответствующий элемент».

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

Мне тоже нравится ваш ответ. – Robokitty