C # Как использовать FirstOrDefault с массивом, не имея System .Linq в пространстве имен?

#c# #.net #arrays #linq

#c# #.net #массивы #linq

Вопрос:

Приведенный здесь код работает, когда я тестирую его в IDE, но само программное обеспечение, которое будет использовать этот код, не дает мне возможности объявить using 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. Обратный путь…. какую ошибку вы на самом деле получаете?

2. Вы должны ссылаться на System . Ядро с версией> = 3.5. Почему это может быть проблемой?

3. Вы просите альтернативу Linq или решение, чтобы заставить Linq работать?

4. Программное обеспечение, использующее ваш код, должно иметь .NET Framework версии 3.5 или выше

5. @user2310920 Хотя версия framework является вероятным кандидатом на то, что она не работает, FirstOrDefault достаточно проста, чтобы вы могли реализовать ее самостоятельно, если вам действительно нужно; хотя это не то решение, которое я бы предложил.

Ответ №1:

не дает мне возможности объявить ‘используя 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

Комментарии:

1. Я попробовал это, и я получил: Ошибка компилятора «Имя типа или пространства имен «Linq» не существует в пространстве имен «System» (вам не хватает ссылки на сборку?)»

2. @user2310920: я думал, что вы можете использовать LINQ, но вы не можете изменить using часть. Какую платформу вы используете? Возможно, вы могли бы использовать .NET 3.5 или выше, но проект настроен на использование более низкой версии.

3. Он должен использовать 3.5 или 4.0 даже. Когда я пытаюсь обратиться к системе. Core я получаю то же сообщение, что и в первом комментарии здесь, но вместо «Linq» я вижу «Core», что действительно странно.

4. @user2310920: что значит «это должно быть» ? Что это за целевая платформа ? Посмотрите на настройки проекта (щелкните правой кнопкой мыши, свойства). System.Core Добавлена ли dll в качестве ссылки в вашем проекте?

5. Я, кажется, сбиваю вас с толку, сообщения компилятора, которые я публикую здесь, получены от компилятора внутри программного обеспечения. Он лицензирован, и сотрудники службы поддержки отвечают не так часто, у меня нет никаких проблем с получением решения, которое вы опубликовали, для работы в IDE, когда не используется System.Linq; в пространстве имен. В любом случае, я жду от них ответа, что может быть причиной этого. Я хотел задать вопрос здесь, чтобы узнать, где я нахожусь, и, возможно, прояснить все, что я могу делать неправильно. Кстати, это программное обеспечение для извлечения веб-данных.

Ответ №2:

Вы можете реализовать FirstOrDefault его самостоятельно или взять из справочного источника:

 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);
}
  

Ответ №3:

Самый простой способ избежать LINQ и использовать array для первого или по умолчанию:

 Array.Find(array, predicate);