[英]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.