Как преобразовать Строку в ее эквивалентное Дерево выражений LINQ?

Если вы заморозили макет после установки адаптера, он больше не глотает щелчки:

recyclerView.isLayoutFrozen = true // kotlin
recyclerView.setLayoutFrozen(true); // java

Просто имейте в виду, что если вам нужно изменить данные в адаптере, вы должны разморозить макет. перед вызовом notifyDataSetChanged, а затем повторно заморозить макет. Я не люблю это решение, но оно единственное, которое сработало для меня.

164
задан Amit 8 April 2018 в 22:55
поделиться

3 ответа

Поможет ли здесь динамическая библиотека linq ? В частности, я думаю как предложение Где . Если необходимо, поместите его в список / массив просто для вызова . Где (строка) на нем! то есть

var people = new List<Person> { person };
int match = people.Where(filter).Any();

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

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

Вы можете взглянуть на DLR . Это позволяет вам оценивать и выполнять скрипты внутри приложения .NET 2.0. Вот пример с IronRuby :

using System;
using IronRuby;
using IronRuby.Runtime;
using Microsoft.Scripting.Hosting;

class App
{
    static void Main()
    {
        var setup = new ScriptRuntimeSetup();
        setup.LanguageSetups.Add(
            new LanguageSetup(
                typeof(RubyContext).AssemblyQualifiedName,
                "IronRuby",
                new[] { "IronRuby" },
                new[] { ".rb" }
            )
        );
        var runtime = new ScriptRuntime(setup);
        var engine = runtime.GetEngine("IronRuby");
        var ec = Ruby.GetExecutionContext(runtime);
        ec.DefineGlobalVariable("bob", new Person
        {
            Name = "Bob",
            Age = 30,
            Weight = 213,
            FavouriteDay = "1/1/2000"
        });
        var eval = engine.Execute<bool>(
            "return ($bob.Age > 3 && $bob.Weight > 50) || $bob.Age < 3"
        );
        Console.WriteLine(eval);

    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Weight { get; set; }
    public string FavouriteDay { get; set; }
}

Конечно, этот метод основан на оценке во время выполнения, и код не может быть проверен во время компиляции.

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

Еще одна такая библиотека - Flee

Я провел быстрое сравнение Dynamic Linq Library и Flee и Фли был в 10 раз быстрее для выражения "(Имя == \" Йохан \ "И зарплата> 500) ИЛИ (Имя! = \" Йохан \ "И зарплата> 300)"

Вот как вы можете написать свой код, используя Flee.

static void Main(string[] args)
{
  var context = new ExpressionContext();
  const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
  context.Variables.DefineVariable("Person", typeof(Person));
  var e = context.CompileDynamic(exp);

  var bob = new Person
  {
    Name = "Bob",
    Age = 30,
    Weight = 213,
    FavouriteDay = new DateTime(2000, 1, 1)
  };

  context.Variables["Person"] = bob;
  var result = e.Evaluate();
  Console.WriteLine(result);
  Console.ReadKey();
}
29
ответ дан 23 November 2019 в 21:14
поделиться
Другие вопросы по тегам:

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