2016-08-13 41 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方法(IEnumerable,Func)的功能在我的代碼中找到here

完整的源file

+0

什麼是_Namespaces_?這裏沒有這個名字的變量 – Steve

+0

@Steve,有一個'公共靜態只讀列表>命名空間' – 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方法OD。該簽名與Enumerable.First兼容,但請注意,行爲與Enumerable.FirstOrDefault兼容,即在元素不存在的情況下,您將獲得NRE而不是「Sequence contains no matching element」。

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

我也喜歡你的答案。 – Robokitty

相關問題