C# 如何将方法“utilities.DecryptStringFromBase64String”的调用限制为仅一次
我正在从一个web服务调用中获取凭据数据,在对其进行解密时,格式为username:::password。我还有其他类,最后我创建了如下数据类C# 如何将方法“utilities.DecryptStringFromBase64String”的调用限制为仅一次,c#,C#,我正在从一个web服务调用中获取凭据数据,在对其进行解密时,格式为username:::password。我还有其他类,最后我创建了如下数据类 var lstStudents = new List<Student> { new Student { Name = "studen1", Credentials = new List<Credential&
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=…-你可以省去一些不必要的计算和分配。请你把查询发出来。不明白