c# - Могу ли я объявить / использовать некоторую переменную в LINQ? Или я могу написать следующий очиститель LINQ?




2 Answers

Вам нужно:

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        let name = t.ComponentType.GetProperty(t.Name)
        where (name != null)
        select name;

Если вы хотите сделать это в синтаксисе запросов, вы можете сделать это более эффективным (afaik) и более чистым способом:

var q = TypeDescriptor
            .GetProperties(instance)
            .Select(t => t.ComponentType.GetProperty(t.Name))
            .Where(name => name != null);
c# linq

Могу ли я объявить / использовать некоторую переменную в LINQ ?

Например, можно ли написать следующий очиститель LINQ?

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        where (t.ComponentType.GetProperty(t.Name) != null)
        select t.ComponentType.GetProperty(t.Name);

Существуют ли способы не писать / вызывать t.ComponentType.GetProperty(t.Name) два раза здесь?




Существует альтернатива, о которой мало кто знает ( select a into b ):

var q = from PropertyDescriptor t in TypeDescriptor.GetProperties(instance)
        select t.ComponentType.GetProperty(t.Name) into u
        where u != null
        select u;

Это означает:

var q = TypeDescriptor.GetProperties(instance)
        .Select(t => t.ComponentType.GetProperty(t.Name))
        .Where(prop => prop != null);

Если версия let base переводится на:

var q = TypeDescriptor.GetProperties(instance)
        .Select(t => new { t, prop = t.ComponentType.GetProperty(t.Name) })
        .Where(x => x.prop != null)
        .Select(x => x.prop);

Необязательное выделение на элемент, потому что t все еще находится в области видимости (пока не используется). Компилятор C # должен просто оптимизировать это, но это не так (или спецификация языка не позволяет этого, не уверен).




Related


Tags

c#   linq