LINQ: “содержит” и запрос Лямбды

Вы могли использовать getTimezoneOffset, чтобы получить смещение между локальной датой и GMT, и затем сделать математику. Но это только будет столь же точно как часы пользователя.

, Если Вы хотите точное время, необходимо соединиться с сервер NTP . Из-за Та же политика Источника , Вы не можете выполнить запрос с JS к другому серверу затем Ваш. Я предложил бы, чтобы Вы создали сценарий серверной стороны, который соединяется с сервером NTP (в PHP, или безотносительно языка Вы хотите), и возвратите точную дату. Затем используйте запрос Ajax для чтения на этот раз.

155
задан Mark Amery 23 January 2018 в 22:56
поделиться

4 ответа

Вместо этого используйте Any () of Contains () :

buildingStatus.Any(item => item.GetCharValue() == v.Status)
294
ответ дан 23 November 2019 в 21:55
поделиться

Метод расширения Linq Any может работать для вас ...

buildingStatus.Any(item => item.GetCharValue() == v.Status)
37
ответ дан 23 November 2019 в 21:55
поделиться

Я не уверен именно то, что вы ищете, но эта программа:

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public StatusType Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = Building.StatusType.open },
        new Building () { Name = "two", Status = Building.StatusType.closed },
        new Building () { Name = "three", Status = Building.StatusType.weird },

        new Building () { Name = "four", Status = Building.StatusType.open },
        new Building () { Name = "five", Status = Building.StatusType.closed },
        new Building () { Name = "six", Status = Building.StatusType.weird },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };

        var q = from building in buildingList
                where statusList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);
    }

производит ожидаемый результат:

one: open
two: closed
four: open
five: closed

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

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public string Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = "open" },
        new Building () { Name = "two", Status = "closed" },
        new Building () { Name = "three", Status = "weird" },

        new Building () { Name = "four", Status = "open" },
        new Building () { Name = "five", Status = "closed" },
        new Building () { Name = "six", Status = "weird" },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };
        var statusStringList = statusList.ConvertAll <string> (st => st.ToString ());

        var q = from building in buildingList
                where statusStringList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);

        Console.ReadKey ();
    }

Я создал этот метод расширения для преобразования одного IEnumerable другому, но я не уверен, насколько это эффективно; он может просто создать список "за кулисами".

public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
    foreach ( TSource source in sources )
        yield return convert (source);
}

Затем вы можете изменить предложение where на:

where statusList.ConvertEach <string> (status => status.GetCharValue()).
    Contains (v.Status)

и пропустить создание List с помощью ConvertAll () в начало.

3
ответ дан 23 November 2019 в 21:55
поделиться

Если я правильно понимаю, вам необходимо преобразовать тип (значение символа), который вы храните в списке Building к типу (перечислению), который вы храните в списке buildingStatus.

(Для каждого статуса в списке зданий // символьное значение //, существует ли статус в списке buildingStatus // enum value //)

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry,  
IList<BuildingStatuses> buildingStatus) 
{ 
    return from v in qry
           where ContainsStatus(v.Status)
           select v;
} 


private bool ContainsStatus(v.Status)
{
    foreach(Enum value in Enum.GetValues(typeof(buildingStatus)))
    {
        If v.Status == value.GetCharValue();
            return true;
    }

    return false;
}
-1
ответ дан 23 November 2019 в 21:55
поделиться
Другие вопросы по тегам:

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