Можно ли объединить эти циклы foreach в одну? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть эти три цикла for

    foreach (var entityView in entitiesWithLookups)
    {
        IEnumerable<string> fieldNamesForAttributeLookup = entityView.Attributes.Where(x => x.Type == DataType.Lookup)
            .Select(x => x.InternalName);

        var entityRegistrationsWithLookups =
            ReadEntityRegistrations(entityView.InternalName, DateTime.Now);

        foreach (var entityRegistration in entityRegistrationsWithLookups)
        {
            foreach (var fieldName in fieldNamesForAttributeLookup)
            {
                output.Add(new ReferenceView()
                {
                    EntityName = entityView.InternalName,
                    ForeignKey = long.Parse(entityRegistrationView.Attributes[fieldName].ToString()),
                    ValidFrom = entityRegistration .ValidFrom,
                    ValidTo =  entityRegistration .ValidTo,
                });
            }
        }
    }

Три цикла foreach используются для получения параметра, необходимого для создания ReferenceView, и добавления его в список вывода.

Is как-то можно оптимизировать это?

Я пытаюсь использовать resharper и получил это

from entityView in entitiesWithLookups
                let fieldNamesForAttributeLookup = entityView.Attributes.Where(x => x.Type == DataType.Lookup)
                    .Select(x => x.InternalName)
                let entityRegistrationsWithLookups = ReadEntityRegistrations(entityView.InternalName, DateTime.Now)
                from entityRegistration in entityRegistrationsWithLookups
                from fieldName in fieldNamesForAttributeLookup
                select new ReferenceView()
                {
                    EntityName = entityView.InternalName,
                    ForeignKey = long.Parse(entityRegistrationView.Attributes[fieldName].ToString()),
                    ValidFrom = entityRegistration.ValidFrom,
                    ValidTo = entityRegistration.ValidTo
                }).ToList();

но действительно ли это оптимизировано? Это не кажется очень читабельным?

1 Ответ

0 голосов
/ 02 апреля 2020

Если вы хотите использовать LINQ для этого, это будет что-то вроде этого.

foreach (var entityView in entitiesWithLookups)
        {
            IEnumerable<string> fieldNamesForAttributeLookup = entityView.Attributes.Where(x => x.Type == DataType.Lookup true)
                .Select(x => x.InternalName);

            var entityRegistrationsWithLookups = new ReadEntityRegistrations(entityView.InternalName, DateTime.Now);

            output.AddRange(entityRegistrationsWithLookups.SelectMany(
                   entityRegistration => fieldNamesForAttributeLookup
                    .Select(fieldName => new ReferenceView()
                    {
                        EntityName = entityView.InternalName,
                        ForeignKey = long.Parse(entityRegistrationView.Attributes[fieldName].ToString()),
                        ValidFrom = entityRegistration.ValidFrom,
                        ValidTo = entityRegistration.ValidTo,
                    })));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...