StudentManager/StudentManager/Common/ErrorSet.cs

189 lines
4.6 KiB
C#

using DryIoc.ImTools;
using StudentManager.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StudentManager.Common
{
public class QuestionBase
{
public int ID { get; set; } = 0;
public bool Status { get; set; } = false;
}
public class ErrorBase
{
public QuestionBase QuestionBase { get; set; } = new QuestionBase();
public int TotalUseCount { get; set; } = 1;
public int ErrorCount { get; set; } = 1;
public int CorrectCount { get; set; } = 0;
}
public class DetailErrorInfo
{
public QuestionData QuestionData { get; set; } = new QuestionData();
public int TotalUseCount { get; set; } = 1;
public int ErrorCount { get; set; } = 1;
public int CorrectCount { get; set; } = 0;
public bool Status { get; set; } = false;
}
public class DetailErrorSetInfo
{
public int TotalCount { get; set; } = 0;
public int TotalErrorCount { get; set; } = 0;
public int CorrectCount { get; set; } = 0;
public int ErrorCount { get; set; } = 0;
public float ErrorRate { get; set; } = 0;
public float CorrectRate { get; set; } = 0;
}
public class ErrorSet
{
public int TotalCount { get; set; } = 0;
public int CorrectCount { get; set; } = 0;
public Dictionary<int, ErrorBase> Errores { get; set; } = new Dictionary<int, ErrorBase>();
public List<int> ErrorArray { get; set; } = new List<int>();
public List<int> CorrectArray { get; set; } = new List<int>();
public int CorrectThresholds { get; set; } = 2;
public void InitErrorSetData()
{
foreach (var item in Errores)
{
if (item.Value.QuestionBase.Status == true) CorrectArray.Add(item.Value.QuestionBase.ID);
else ErrorArray.Add(item.Value.QuestionBase.ID);
}
}
public DetailErrorSetInfo GetDetailErrorSetInfo()
{
return new DetailErrorSetInfo
{
TotalCount = QuestionLib.GetQuestionCount(),
TotalErrorCount = Errores.Count(),
CorrectCount = CorrectArray.Count(),
ErrorCount = ErrorArray.Count(),
ErrorRate = ErrorArray.Count() / QuestionLib.GetQuestionCount(),
CorrectRate = CorrectArray.Count() / Errores.Count()
};
}
public ObservableCollection<DetailErrorInfo> GetDetailErrorQuestionList()
{
ObservableCollection<DetailErrorInfo> list = new ObservableCollection<DetailErrorInfo>();
foreach (var item in Errores)
{
list.Add(new DetailErrorInfo
{
QuestionData = QuestionLib.Get(item.Key),
CorrectCount = item.Value.CorrectCount,
ErrorCount = item.Value.ErrorCount,
Status = item.Value.QuestionBase.Status
});
}
return list;
}
public void AddQuestion(QuestionBase question)
{
if (question.Status)
{
AddCorrectQuestion(question);
}
else
{
AddErrorQuestion(question);
}
}
public void AddErrorQuestion(int id)
{
}
public void AddCorrectQuestion(int id)
{
}
public void AddErrorQuestion(QuestionBase question)
{
if (Errores.ContainsKey(question.ID))
{
Errores[question.ID].TotalUseCount++;
Errores[question.ID].ErrorCount++;
CompareToErrorArray(Errores[question.ID]);
}
else
{
TotalCount++;
Errores.Add(question.ID, new ErrorBase { QuestionBase = { ID = question.ID } });
ErrorArray.Add(question.ID);
}
}
public void AddErrorQuestion(QuestionData question)
{
}
public void AddCorrectQuestion(QuestionBase id)
{
if (Errores.ContainsKey(id.ID))
{
CorrectCount++;
Errores[id.ID].QuestionBase.Status = true;
Errores[id.ID].CorrectCount++;
CompareToCorrectArray(Errores[id.ID]);
}
}
private void CompareToErrorArray(ErrorBase id)
{
if (id.QuestionBase.Status == false || ErrorArray.Contains(id.QuestionBase.ID)) return;
if ((id.CorrectCount - id.CorrectCount) <= CorrectThresholds)
{
id.QuestionBase.Status = false;
CorrectArray.Remove(id.QuestionBase.ID);
ErrorArray.Add(id.QuestionBase.ID);
}
}
private void CompareToCorrectArray(ErrorBase id)
{
if (id.QuestionBase.Status == true || CorrectArray.Contains(id.QuestionBase.ID)) return;
if ((id.CorrectCount - id.CorrectCount) > CorrectThresholds)
{
id.QuestionBase.Status = true;
ErrorArray.Remove(id.QuestionBase.ID);
CorrectArray.Add(id.QuestionBase.ID);
}
}
public void AddCorrectQuestion(QuestionData question)
{
AddCorrectQuestion(new QuestionBase { ID = question.Id });
}
public void QueryErrorSet(int id)
{
Errores.Clear();
SQLHelper.Query<UserQuestionData>(Tables.UQTable, id).ForEach(x =>
{
AddQuestion(new QuestionBase { ID = x.PID, Status = x.Status });
});
}
}
}