как я могу ограничить вызов только один раз для метода "utilities.DecryptStringFromBase64String" - PullRequest
1 голос
/ 14 апреля 2020

Я получаю учетные данные от одного из вызовов веб-службы, и во время его расшифровки используется формат «имя пользователя ::: пароль». У меня есть и другой класс, и, наконец, я создаю класс данных, как показано ниже,

 var lstStudents = new List<Student>
        {
            new Student
            {
                Name = "studen1",
                Credentials = new List<Credential> {new Credential {Key = "N1", Cred = "pNn/B3yUB+x2yiC310efoAjb8EkNhH1oD3NYF0v5SNxUKPtOtpxL21saVJGjmYPi" }, new Credential { Key = "N2", Cred = "" }}
            },
            new Student
            {
                Name = "studen2",
                Credentials = new List<Credential> {new Credential {Key = "N1", Cred = "PT7CpnUcG7DIrJTxN8CcqoHAyTbNNST3DzGLpGQUHF6/jyooYKW1puXb/a+WX2M8" }, new Credential { Key = "N2", Cred = "" }}
            },
        };

        var filterList = lstStudents.SelectMany(x => x.Credentials.Select(y => 
                new Data
                {
                    StudentName = x.Name, 
                    CredentialKey = y.Key,
                    UserName = utilities.DecryptStringFromBase64String(y.Cred, key).Before(":::") , 
                    Password = utilities.DecryptStringFromBase64String(y.Cred, key).After(":::")
                }))
            .Where(d => d.CredentialKey == "N1")
            .ToList();

Поддерживающие классы,

public class Data
{
    public string StudentName { get; set; }
    public string CredentialKey { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

public class Student
{
    public string Name { get; set; }
    public List<Credential> Credentials { get; set; }
}

public class Credential
{
    public string Key { get; set; }
    public string Cred { get; set; }
}

В приведенном выше коде я вызываю метод DecryptStringFromBase64String 2 раза, Я хотел бы назвать это только один раз и подготовить свой класс данных, как это сделать? Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2020

Это будет легче, если вы настроите запрос для использования фактического синтаксиса языка LINQ (а не методов расширения), так как тогда вы можете использовать let:

var filterList = (
    from x in lstStudents
    from y in x.Credentials
    let s = utilities.DecryptStringFromBase64String(y.Cred, key)
    let d = new Data
    {
        StudentName = x.Name,
        CredentialKey = y.Key,
        UserName = s.Before(":::"),
        Password = s.After(":::")
    }
    where d.CredentialKey == "N1"
    select d
).ToList();

или сделать * На 1005 * раньше, чтобы избежать некоторых вычислений / распределений:

var filterList = (
    from x in lstStudents
    from y in x.Credentials
    where y.Key == "N1"
    let s = utilities.DecryptStringFromBase64String(y.Cred, key)
    let d = new Data
    {
        StudentName = x.Name,
        CredentialKey = y.Key,
        UserName = s.Before(":::"),
        Password = s.After(":::")
    }
    select d
).ToList();

Лично я бы также изменил все x, y, s, d на более значимые, но я пока оставил их такими же, чтобы вы могли видеть, как они отображаются.

Альтернативой было бы, как отметил @Sinatr в комментариях, использовать лямбду с телом:

var filterList = lstStudents.SelectMany(x => x.Credentials.Select(y => {
    var s = utilities.DecryptStringFromBase64String(y.Cred, key);
    return new Data {
        StudentName = x.Name, 
        CredentialKey = y.Key,
        UserName = s.Before(":::") , 
        Password = s.After(":::")
    };
}))
.Where(d => d.CredentialKey == "N1")
.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...