C# 如何将方法“utilities.DecryptStringFromBase64String”的调用限制为仅一次

C# 如何将方法“utilities.DecryptStringFromBase64String”的调用限制为仅一次,c#,C#,我正在从一个web服务调用中获取凭据数据,在对其进行解密时,格式为username:::password。我还有其他类,最后我创建了如下数据类 var lstStudents = new List<Student> { new Student { Name = "studen1", Credentials = new List<Credential&

我正在从一个web服务调用中获取凭据数据,在对其进行解密时,格式为username:::password。我还有其他类,最后我创建了如下数据类

 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次,我只想调用它一次并准备我的数据类,如何做到这一点?谢谢

如果您调整查询以使用实际的LINQ语言语法而不是扩展方法,这将更容易,因为您可以使用let:

变量过滤器列表= 学生中的x 从y到x.凭证 设s=utilities.DecryptStringFromBase64Stringy.Cred,密钥 设d=新数据 { StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: } 其中d.CredentialKey==N1 选择d 托利斯特先生; 或者更快地进行where操作,以避免某些计算/分配:

变量过滤器列表= 学生中的x 从y到x.凭证 其中y.Key==N1 设s=utilities.DecryptStringFromBase64Stringy.Cred,密钥 设d=新数据 { StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: } 选择d 托利斯特先生; 就我个人而言,我也会改变所有的x,y,s,d,使其更有意义,但我现在将它们保持不变,以便您可以看到它是如何映射的

如@Sinatr在评论中所述,另一种选择是使用带有主体的lambda:

var filterList=lststustudents.SelectManyx=>x.Credentials.Selecty=>{ var s=utilities.DecryptStringFromBase64Stringy.Cred,密钥; 返回新数据{ StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: }; } 其中d=>d.CredentialKey==N1 托利斯特先生;
如果您调整查询以使用实际的LINQ语言语法而不是扩展方法,这将更容易,因为您可以使用let:

变量过滤器列表= 学生中的x 从y到x.凭证 设s=utilities.DecryptStringFromBase64Stringy.Cred,密钥 设d=新数据 { StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: } 其中d.CredentialKey==N1 选择d 托利斯特先生; 或者更快地进行where操作,以避免某些计算/分配:

变量过滤器列表= 学生中的x 从y到x.凭证 其中y.Key==N1 设s=utilities.DecryptStringFromBase64Stringy.Cred,密钥 设d=新数据 { StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: } 选择d 托利斯特先生; 就我个人而言,我也会改变所有的x,y,s,d,使其更有意义,但我现在将它们保持不变,以便您可以看到它是如何映射的

如@Sinatr在评论中所述,另一种选择是使用带有主体的lambda:

var filterList=lststustudents.SelectManyx=>x.Credentials.Selecty=>{ var s=utilities.DecryptStringFromBase64Stringy.Cred,密钥; 返回新数据{ StudentName=x.Name, CredentialKey=y.键, 用户名=s。在以下日期之前:, 密码=s。之后::: }; } 其中d=>d.CredentialKey==N1 托利斯特先生;
使用将调用结果存储到局部变量中,然后将该变量与Before和After一起使用两次。使用。将调用结果存储到局部变量中,然后将该变量与Before和After一起使用两次。@user584018顺便说一句,如果您将where d.CredentialKey==N1上升了几级,则在let s=…-你可以省去一些不必要的计算和分配。请你把查询发出来。得不到it@user584018顺便说一句,如果您将where d.CredentialKey==N1上升几级,则在let s=…-你可以省去一些不必要的计算和分配。请你把查询发出来。不明白