我如何只能将方法“ utilities.DecryptStringFromBase64String”的调用限制为一次,

问题描述 投票:1回答:1

我从一个Web服务调用中获取凭据数据,并且在解密它时,格式为“ username ::: password”。我也有其他的类,最后我正在创建如下的Data类,

 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,我只想调用一次并准备我的数据类,该怎么做?谢谢!

c#
1个回答
2
投票

如果调整查询以使用实际的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();

或尽早执行where,以避免进行一些计算/分配:

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();

我个人也将所有xysd更改为更有意义,但我现在将它们保留不变,因此您可以看到它们的映射方式。] >

如@Sinatr在评论中所述,另一种方法是将lambda与body一起使用:

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();
© www.soinside.com 2019 - 2024. All rights reserved.