2014-06-27 35 views
3

這裏提供的代碼適用於我在IDE中測試它,但是使用此代碼的軟件本身不會給我聲明using System.Linq的可能性。我被困在試圖找出如何使用這個我不得不回到我不想使用的解決方案,因爲它的準確率較低。C#如何在數組中使用FirstOrDefault而命名空間中無法使用System.Linq?

的問題是在這裏

var stringMatch = sArray.FirstOrDefault(titleID.Contains); 

我不知道如何正確地提供參考。我認爲這應該是沿着System.Linq.Enumerable的方式......但這是我第一次處理這樣的問題,所以任何幫助非常讚賞。

 string TakeEndPeriod = ""; 
     string NewEndPeriod = ""; 
     string FindEndSpace = ""; 
     string GetEndPeriod = ""; 
     string titleID = "document for the period ended December 31 2014"; 

     string s1 = "ended "; 
     string s2 = "Ended "; 
     string s3 = "Ending "; 
     string[] sArray = new [] { s1, s2, s3}; 


      var stringMatch = sArray.FirstOrDefault(titleID.Contains); 
      if (stringMatch != null) 
      { 
       TakeEndPeriod = titleID.Substring(titleID.LastIndexOf(stringMatch)); 
       FindEndSpace = TakeEndPeriod.Substring(TakeEndPeriod.IndexOf(" ")); 
       GetEndPeriod = FindEndSpace.Substring(1); 

       string[] formatArray = new[] { "dd MMMM yyyy", "MMMM dd yyyy" }; 

       DateTime ModEndPeriod; 
       if (!DateTime.TryParseExact(GetEndPeriod, 
              formatArray, 
              System.Globalization.CultureInfo.InvariantCulture, 
              System.Globalization.DateTimeStyles.None, 
              out ModEndPeriod)) 
       { 
         //parsing failed 

       } 

       NewEndPeriod = ModEndPeriod.ToString("yyyy-MM-ddT00:00:00Z"); 

編輯:

錯誤消息我得到:

'System.Array' does not contain a definition for 'FirstOrDefault' and no extension 
method 'FirstOrDefault' accepting a first argument of type 'System.Array' could be 
found (are you missing a using directive or an assembly reference?) 

編輯:

這是我從開發的支持得到了解決管理軟件:

String Title = "document for the period Ending December 31 2014"; 
      Match M = Regex.Match(Title, ".*?(?i)(ended|ending)(.*)");//Case insensitive search for "ended" and "ending" 
      if (M.Groups.Count == 3) 
      { 
       //Match OK 
       DateTime DT = DateTime.Parse(M.Groups[2].Value); 
       //The variable DT will now have the parsed date. 
       Console.WriteLine(DT.ToString("yyyyMMdd")); 
      } 
+1

回溯....什麼錯誤,你* *實際獲得? – Arran

+0

您應該引用版本> = 3.5的System.Core。爲什麼這可能是一個問題? –

+0

您是否要求Linq的替代方案或獲得Linq的解決方案? –

回答

7

不給我 '使用System.Linq的' 聲明的可能性。

由於Enumerable.FirstOrDefault是一個擴展方法,你也可以使用它的完全限定類名System.Linq.Enumerable

var stringMatch = System.Linq.Enumerable.FirstOrDefault(sArray, s => titleID.Contains(s)); 

甚至更​​短:

var stringMatch = System.Linq.Enumerable.FirstOrDefault(sArray, titleID.Contains); 

注意,擴展方法是一個簡單的靜態方法,這就是爲什麼工作。

Demo

+0

我試過這個,我得到了:編譯器錯誤「名稱空間'系統'中沒有類型或名稱空間名'Linq'(你是否缺少程序集引用?)」 –

+0

@ user2310920:我認爲你可以使用LINQ,但你不能改變'使用'部分。你在使用哪個框架?也許你可以使用.NET 3.5或更高版本,但項目配置爲使用較低版本。 –

+0

甚至應該使用3.5或4.0。當我嘗試引用System.Core時,我得到了與第一個註釋中相同的消息,但不是'Linq',而是'Core',它真的很奇怪。 –

5

您可以實現FirstOrDefault自己或把它從Reference Source

public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) 
{ 
    if (source == null) throw ArgumentException("source"); 
    if (predicate == null) throw ArgumentException("predicate"); 

    foreach (TSource element in source) 
    { 
     if (predicate(element)) 
     return element; 
    } 

    return default(TSource); 
} 
相關問題