Проверьте, является ли массив подмножеством другого

После некоторого рытья, и я закончил настройку Thread CurrentCulture , чтобы иметь CultureInfo («en-US») в методе действия контроллера:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

Вот некоторые другие опции , если вы хотите иметь эту настройку для каждого представления.

О значении свойства CurrentCulture:

Объект CultureInfo , который возвращается этим свойством вместе со связанными с ним объектами, определяет формат по умолчанию для дат, времени, чисел, значений валюты, порядка сортировки текста, условных обозначений обсадной колонны, и сравнение строк.

Источник: MSDN CurrentCulture

Примечание: Предыдущее свойство свойства CurrentCulture вероятно, необязательно, если контроллер уже работает с CultureInfo("en-US") или аналогичным, если формат даты "MM/dd/yyyy".

После установки свойства CurrentCulture добавьте блок кода, чтобы преобразовать дату в формат "M/d/yyyy" в представлении:

@{  //code block 
    var shortDateLocalFormat = "";
    if (Model.AuditDate.HasValue) {
       shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("M/d/yyyy");
       //alternative way below
       //shortDateLocalFormat = ((DateTime)Model.AuditDate).ToString("d");
    }
}

@shortDateLocalFormat

Над переменной @shortDateLocalFormat форматируется работа ToString("M/d/yyyy"). Если используется ToString("MM/dd/yyyy"), как и в первый раз, вы попадаете в с нулевой ошибкой . Также, как рекомендовано , работает Томми ToString("d"). Фактически "d" означает «Короткая диаграмма даты» и может использоваться с различными форматами культуры / языка.

Я думаю, что блок кода сверху также может быть заменен каким-либо методом хелпера хелпера или аналогичным.

Например

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {     
        shortDateLocalFormat = ((DateTime)date).ToString("M/d/yyyy");
     }

    @shortDateLocalFormat
}

можно использовать с этим вспомогательным вызовом

@DateFormatter(Model.AuditDate)

Update, я узнал, что есть альтернативный способ сделать то же самое, когда метод DateTime.ToString (String, IFormatProvider) используется. Когда этот метод используется, нет необходимости использовать свойство Thread CurrentCulture. CultureInfo("en-US") передается как второй аргумент -> Метод IFormatProvider - DateTime.ToString(String, IFormatProvider).

Модифицированный вспомогательный метод:

@helper DateFormatter(object date)
{
    var shortDateLocalFormat = "";
    if (date != null) {
       shortDateLocalFormat = ((DateTime)date).ToString("d", new System.Globalization.CultureInfo("en-US"));
    }

    @shortDateLocalFormat
}

.NET Fiddle

140
задан Dariusz Woźniak 4 October 2018 в 13:08
поделиться

3 ответа

bool isSubset = !t2.Except(t1).Any();
245
ответ дан 23 November 2019 в 23:13
поделиться

Используйте HashSet вместо Списка при работе с наборами. Затем можно просто использовать IsSubsetOf ()

HashSet<double> t1 = new HashSet<double>{1,3,5};
HashSet<double> t2 = new HashSet<double>{1,5};

bool isSubset = t2.IsSubsetOf(t1);

Извините, что он не использует LINQ. :-(

, Если необходимо использовать списки, затем работы решения @Jared с протестом, что необходимо будет удалить любые повторные элементы, которые существуют.

56
ответ дан 23 November 2019 в 23:13
поделиться

Попробуйте это

static bool IsSubSet<A>(A[] set, A[] toCheck) {
  return set.Length == (toCheck.Intersect(set)).Count();
}

, идея здесь, это Пересекается, только возвратит значения, которые находятся в обоих Массивах. В этой точке, если длина получающегося набора совпадает с исходным набором, то все элементы в "наборе" находятся также в "проверке" и поэтому "набор" является подмножеством Примечания "toCheck"

: Мое решение не работает, если "установленный" имеет дубликаты. Я не изменяю его, потому что я не хочу красть голоса других людей.

Подсказка: Я голосовал за ответ Cameron.

-1
ответ дан 23 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: