Cow*_*man 5 c# var ternary-operator
我有两本字典,一本用于我作为主机的文件传输,另一本用于我作为客户端的文件传输。
我正在为我的程序的一个领域编写的代码完全相似,除了引用这些项目之一或另一个。出于这个原因,如果可以的话,我试图防止重复代码。
public void UpdateFileTransferItems(FileTransferItem.FileTransferRole role)
{
// If the role is Sender then the variable is fileTransferSessionsAsHost, otherwise it is fileTransferSessionsAsClient.
var fileTransferSessions = role == FileTransferItem.FileTransferRole.Sender ? fileTransferSessionsAsHost : fileTransferSessionsAsClient;
foreach (var hostSession in fileTransferSessions)
{
Do Work in here.
}
}
Run Code Online (Sandbox Code Playgroud)
显然三元运算符不起作用,但我如何创建代码来完成我想要做的事情?如果角色是发件人,我希望变量是对 的引用fileTransferSessionsAsHost,否则我希望它是fileTransferSessionsAsClient.
我是在用一种迟钝的方式来做这件事吗?我应该只复制代码并有两个 if 语句吗?
编辑:
如果我找不到更好的方法,这就是我现在必须要做的。如果您看一下,除了名称和字典项引用之外,每个代码都是相同的。
public void UpdateFileTransferItems(FileTransferItem.FileTransferRole role)
{
if (role == FileTransferItem.FileTransferRole.Sender)
{
foreach (var hostSession in fileTransferSessionsAsHost)
{
var fileTransferItem = activeFileTransfers.FirstOrDefault(fti => fti.SessionId == hostSession.Key.SessionId);
if (fileTransferItem == null)
{
activeFileTransfers.Add(new FileTransferItem(hostSession.Key.FileName,
hostSession.Key.FileExtension,
hostSession.Key.FileLength,
FileTransferItem.FileTransferRole.Sender,
hostSession.Key.SessionId));
}
else
{
fileTransferItem.Update(hostSession.Value.TotalBytesSent,
hostSession.Value.TransferSpeed,
hostSession.Value.TotalBytesSent == hostSession.Key.FileLength);
}
}
}
else
{
foreach (var clientSession in fileTransferSessionsAsClient)
{
var fileTransferItem = activeFileTransfers.FirstOrDefault(fti => fti.SessionId == clientSession.Key.SessionId);
if (fileTransferItem == null)
{
activeFileTransfers.Add(new FileTransferItem(clientSession.Key.FileName,
clientSession.Key.FileExtension,
clientSession.Key.FileLength,
FileTransferItem.FileTransferRole.Sender,
clientSession.Key.SessionId));
}
else
{
fileTransferItem.Update(clientSession.Value.TotalBytesSent,
clientSession.Value.TransferSpeed,
clientSession.Value.TotalBytesSent == clientSession.Key.FileLength);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了实现您想要的目的,两个类都需要从相同的基类或接口派生。例如,如果您有一个名为 的通用接口IFileTransferSessions,那么以下代码应该可以工作:
IFileTransferSessions fileTransferSessions = role == FileTransferItem.FileTransferRole.Sender ? fileTransferSessionsAsHost : fileTransferSessionsAsClient;
Run Code Online (Sandbox Code Playgroud)
或者如果你真的想保留var语法:
var fileTransferSessions = role == FileTransferItem.FileTransferRole.Sender ? fileTransferSessionsAsHost as IFileTransferSessions : fileTransferSessionsAsClient;
Run Code Online (Sandbox Code Playgroud)
请注意,您只需将第一个第三级结果转换为接口,或者您可以同时执行这两个操作。
该var关键字与 VB 不同Variant,它不关心编译时的类型。(这dynamic与 C# 中的情况更接近)它所做的只是从以下用法派生类型。对于要派生的两个不同的类,它们必须共享一个公共基类或接口,即使这样也var需要了解该基定义才能正常工作。