为什么我需要在LINQ查询上调用ToList()方法?
例如:
private void btnEnc_Click(object sender, RoutedEventArgs e)
{
SHA1 sha = new SHA1Managed();
string sResult = "";
var v = sha.ComputeHash(
UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text)
).Select(
p => sResult += string.Format("{0:x2}", p)
).ToList();
Clipboard.SetText(sResult);
tbxEncrypted.Text = sResult;
}
此外,当我尝试访问剪贴板时,我得到一个安全对话框。我该如何防止这种情况?
答案 0 :(得分:5)
默认情况下,您在部分信任下运行。当调用ClipBoard.SetText()(或ClipBoard.SetText(...))时,用户必须确认访问。
如果您创建了一个浏览器外应用程序并请求提升信任,则此限制将不再适用,并且不会显示任何对话框。
您可以将应用程序配置为需要提升信任度。您需要在应用程序的清单中设置它。
有关详细信息,请查看MSDN:
http://msdn.microsoft.com/en-us/library/ee721083(v=vs.95).aspx
当用户安装Silverlight应用程序时,他们将获得安全警告,然后才能继续。这只发生过一次。以这种方式运行应用程序时,ClipBoard.SetText()调用将不再触发安全对话框。
答案 1 :(得分:4)
您需要调用list的原因是因为在评估LINQ语句创建的表达式之前,不会评估Select中的表达式。因为您正在使用它附加到sResult
,所以除非您使用ToList()“运行”LINQ表达式,否则在将变量放入剪贴板之前,该变量的值不会更改。请注意,ToList()的输出基本上没有价值。
更大的问题是你误用了Select。你真的应该使用string.Join而不是在Select子句中构建字符串。在Select子句中构建它对于阅读代码并且难以理解的人来说意外。
var sResult = string.Join( "",
sha.ComputeHash(
UTF8Encoding.Unicode.GetBytes(tbxWordToEncrypt.Text)
).Select(
p => string.Format("{0:x2}", p)
));
答案 2 :(得分:0)