簡體   English   中英

如何在 C# 中比較兩個字符串列表的元素並查看是否有任何元素可轉換為 double

[英]How to compare the elements of two string lists in C# and see if any element is convertible to double

您好,我正在制作一個測驗應用程序,我想將用戶答案與正確答案進行比較。 當我收集字符串中的答案時,我打算用兩個字符串列表來做到這一點,並且我也有字符串中的正確答案。

我面臨的問題是一半的問題是真/假問題,所以答案是“真”或“假”字符串,另一半是必須執行計算的問題,因此答案是我將其存儲為字符串的數字/雙精度數。

我想給出 0.1 的答案接受范圍,所以如果正確答案是 22.5,那么 22.6 的答案仍然被認為是正確的。 但是,這使得無法將“數字”字符串的值與Equals()方法進行比較。

所以我理想地尋找一個我想說的if語句:

如果元素可轉換為 double 將其轉換並檢查其值是否與正確答案相同或在可接受范圍內

否則,檢查元素是否等於正確答案

現在我已經制作了一個控制台應用程序來嘗試解決這個問題,我已經定義了兩個如下所示的列表:

        static void Main(string[] args)
    {
        List<string> givenAnswers = new List<string>()
        {
            "True","False","True","False","True",
            "60","50","2.321","0.8","1.55"
        };

        List<string> correctAnswers = new List<string>()
        {
            "True","False","False","True","False",
            "70","20","1.231","0.5","1.25"
        };

        correctAnswers.ForEach(Console.WriteLine);

        Console.ReadLine();

    }

主要問題是,如果元素不可轉換,c# 不會返回 false,而是給出會破壞程序的錯誤。

(我之前在我的前端進行比較 - java 腳本,其中不成功的轉換將返回 false)

讓我們提取一個方法來比較兩個答案:

private static bool IsCorrectAnswer(string answer, 
                                    string expectedAnswer, 
                                    double tolerance = 0.1) {
  // Let's not be peevish and tolerate leading / trimming spaces,
  // ignore cases i.e. let " TRUE  " be equal to "True"
  if (string.Equals(answer?.Trim(), 
      expectedAnswer?.Trim(), 
      StringComparison.OrdinalIgnoreCase))
    return true;

  // If we have two double values, let's to parse them and compare 
  // with provided tolerance
  if (double.TryParse(answer, out var leftValue) && 
      double.TryParse(expectedAnswer, out var rightValue))
    return Math.Abs(leftValue - rightValue) <= tolerance;

  //TODO: you may want to add support for other types (say, dates) here

  return false;
}

我沒有得到布爾值和數字的字符串列表,但一般檢查如下所示:

foreach (var answer in givenAnswers)
{
  if (double.TryParse(answer, NumberStyles.Any, CultureInfo.InvariantCulture, out double answerVal) && answerVal == 0.8)
  {
    Console.WriteLine("Nailed it!");
  }
}

我不得不使用“不變文化”,因為在我的國家,0.8 被寫為“0,8”,因此“0.8”被解析為 8 ...

我不會詳細討論“附近”的數字,因為它非常復雜。 比較浮點數,2012 年版

您可以使用double.TryParse來檢查string是否可解析為double並在解析時同時解析它。

bool IsAcceptableAnswser(string givenAnswer, string correctAnswer)
{
  if (double.TryParse(correctAnswer, out var correctNumber) && double.TryParse(givenAnswer, out var givenNumber))
  {
    // When the answers are doubles, use use the double values.
    var diff = Math.Abs(correctNumber - givenNumber);
    return diff <= 0.1;  
  }
  else
  {
    // When the answers aren't doubles, use string.Equals.
    return string.Equals(givenAnswer, correctAnswer);
  }

筆記

  • 為簡單起見,我使用了string.Equals ,但您當然可以使用其他東西來更寬松地使用大小寫。
  • 如果文化是一個問題,您可能還想檢查double.TryParse的其他重載。
  • 為了便於閱讀,我直接使用了0.1 最好使用常量或將其作為參數接收。

嘗試:

var convertible = int.TryParse("60", out_)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM