【问题标题】:Compare Multiple Variables to Same Value Efficiently有效地将多个变量与相同的值进行比较
【发布时间】:2018-10-31 08:34:51
【问题描述】:

我正在寻找 C# 中的替代方法来将多个变量与相同的值进行比较,并且我希望它们能够根据条件结果共享相同的后续指令。

例如,我有以下代码:

string DOBResultsError = VerifySingleRecordReturned(DOBResults, APIParameters, 1);
string NameResultsError = VerifySingleRecordReturned(NameResults, APIParameters, 2);

if (DOBResultsError != string.Empty)
{
    PatientRecordUpdate(DOBResults, APIParameters.PatientID, DOBResultsError);
}
else if (NameResultsError != string.Empty)
{
    PatientRecordUpdate(NameResults, APIParameters.PatientID, NameResultsError);
}

我必须明确指示 PatientRecordUpdate 对与 String.Null 进行比较的每个变量执行。

我希望发生的事情如下:

if (DOBResultsError != string.Empty || NameResultsError != string.Empty)
{
    //whichever isn't an empty string use to perform PatientRecordUpdate()
}

这种语法在 C# 中是否可行?

使用switch 关键字不会产生影响,因为即使我可以在多种情况下导致执行相同的指令,但如果我需要使用其中一个比较变量,我仍然需要明确说明为每种可能的情况使用变量的代码。

string DOBResultsError = VerifySingleRecordReturned(DOBResults, APIParameters, 1);
string NameResultsError = VerifySingleRecordReturned(NameResults, APIParameters, 2);
string SSNResultsError = VerifySingleRecordReturned(SSNResults, APIParameters, 3);
string EmptyString = String.Empty;

switch (EmptyString)
{
    case DOBResultsError:
    case SSNResultsError: //can't use SSNResultsError with PatientRecordUpdate() without stating PatientRecordUpdate() again
        PatientRecordUpdate(DOBResults, APIParameters.PatientID, DOBResultsError);

    case NameResultsError:
        PatientRecordUpdate(NameResults, APIParameters.PatientID, NameResultsError);
}

任何帮助表示赞赏。

更新:要求提供更多信息

这就是 VerifySingleRecordReturnedFrom() 所做的。它会检查一些可能导致程序错误的条件,并在 SQL DB 的记录中写入一条错误消息。

public static string VerifySingleRecordReturnedFrom(List<PatientList3> ReturnedPatientList, AutoPatientLookup APIParameters, int SearchCriteria = 0)
        {
            string ErrorMessage = String.Empty;
            if (ReturnedPatientList.Count == 0)
            {
                //Error Message for Dob
                if (SearchCriteria == 1)
                {
                    ErrorMessage = string.Format("No patients were returned from  for DOB ....");
                    return ErrorMessage;
                }
                //Error Message for Name
                else if (SearchCriteria == 2)
                {
                    ErrorMessage = string.Format("No patients were returned from  for patient name ....");
                    return ErrorMessage;
                }
                //Error Message for PracticePatientNumber
                else if (SearchCriteria == 3)
                {
                    ErrorMessage = string.Format("No patients were returned from  for PracticePatientNumber...");
                    return ErrorMessage;
                }
            }
            // more than one patient in common results list from AttemptToMatchPatientsByDemographics() or  results using PatientNumber
            else if (ReturnedPatientList.Count() > 1)
            {
                switch(SearchCriteria)
                {
                    case 1:
                    case 2:
                        ErrorMessage = String.Format("{0} number of patients were returned...");
                        break;

                    //More than one patient returned from  for any given PracticePatientNumber
                    case 3:
                        ErrorMessage = String.Format("{0} number of patients were returned....");
                        break;
                }
                return ErrorMessage;
            }
            //No error in number of results from 
            return ErrorMessage;
        }

所有结果(DOB/姓名/SSN)类型都是以下 PatientList3 对象的 List 对象(我已包含子类):

public class PatientList3
        {
            public Patient PatientNameID { get; set; }
            public string PatientNumber { get; set; }
            public string ChartNumber { get; set; }
            public Gender2 Gender { get; set; }
            public string DOB { get; set; }
            public string PhoneNumber { get; set; }
            public string SSN { get; set; }
        }

public class Patient
        {
            public int ID { get; set; }
            public PtName Name { get; set; }
        }

public class PtName
        {
            public string First { get; set; }
            public string Middle { get; set; }
            public string Last { get; set; }
            public string Suffix { get; set; }
            public string Full { get; set; }
            public string Preferred { get; set; }
        }
public class Gender2
        {
            public string LookupType { get; set; }
            public string Code { get; set; }
            public string Description { get; set; }
            public int Order { get; set; }
            public bool Active { get; set; }
            public List<AlternateCodes> AlternateCodes { get; set; } //Not important, didn't include AlternativeCodes class
        }

这是APIParameters的类:

public class AutoPatientLookup
        {
            public string DOB { get; set; }
            public string Gender { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int? PatientNumber { get; set; }
            public string SSN { get; set; }
            public int PracticeID { get; set; }
            public int PatientID { get; set; }
        }

【问题讨论】:

  • 能否分享一下VerifySingleRecordReturned的代码,DOBResultsAPIParameters的输入参数类型是什么?这可能有助于我们提出一些建议。
  • 您可以使用List&lt;Tuple&lt;Results, string&gt;&gt;,假设每个Results对象都继承自同一个基类或实现同一个名为Results的接口。
  • DOBResultsNameResultsSSNResults 是同一类型吗?
  • “最好让他们根据他们的条件结果分享相同的后续指令”——你能重述那句话,以便五岁的孩子能理解吗?跨度>
  • @DmitryPavlov 我已经用您要求的信息更新了问题

标签: c# conditional


【解决方案1】:

考虑为一些通用逻辑使用基本结果类型,如下所示:

// assuming both results inherit from or implement some base type...
List<ResultBase> results = new List<ResultBase>()
{
    DOBResults,
    NameResults 
}; // order matters since it's used for the parameter index

// Note that a class would be a much better option than a tuple here.
// Select will verify each result but only upon request until FirstOrDefault is fulfilled
Tuple<ResultBase, string> firstResultError = results
    .Select((result, index) => new Tuple<ResultBase, string>(
        result,
        VerifySingleRecordReturned(result, APIParameters, index + 1)))
    .FirstOrDefault(result => !string.IsNullOrEmpty(result.Item2 /* Error message */));

// If there was at least one error, call the original patient update record
// with the associated information.
if (firstResultError != null)
{
    PatientRecordUpdate(
        firstResultError.Item1 /* Failed result */,
        APIParameters.PatientID,
        firstResultError.Item2 /* Error message for that result */);
}

出于可维护性的原因,您将希望使用新类而不是元组,但除此之外,这应该可以让您朝着一个好的方向开始。

【讨论】:

  • 我认为 PatientRecordUpdate 应该被调用时出现 each 错误——所以 FirstOrDefault 应该是 Where,而 if (firstResultError != null) {...} 应该是 foreach环形。我没有 dv,但我认为您的回答有误。
  • OP 的原始代码使用了else if,而他的目标伪代码使用了术语“无论哪个”。这两个都暗示他们只对设置第一个错误感兴趣,而不是聚合或覆盖。不过,感谢您的评论。
  • 好点,我错过了else。可能我不是唯一一个。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多