如何比较两个列表

时间:2019-04-29 06:19:29

标签: c# list

我有一个从以下用户那里收到的答案的列表:

List<UserAnswerToQue> lstGetUserAnswerIndex = new List<UserAnswerToQue>();

和类UserAnswerToQue如下:

public class UserAnswerToQue
{
    int _Qu_Id;
    string _Title;

    public UserAnswerToQue(int qu_Id, string ans_Title)
    {
        _Qu_Id = qu_Id;
        _Title = ans_Title;
    }
 }

并列出问题的真实答案:

var ListFinalTrueAnswer = (from x in FilteredTrueReceivedAnswerList
                                       select (x.qu_Id, x.ans_Title)).ToList();

列表ListFinalTrueAnswer包含Item1和Item2

我想找到用户对问题的真实答案,为此,我需要比较两个列表lstGetUserAnswerIndex和ListFinalTrueAnswer。 如何比较这两个列表并确定答案是正确的?

3 个答案:

答案 0 :(得分:3)

创建带有真实答案ID的哈希集。 (以快速查找)

var trueAnswers = ListFinalTrueAnswer.Select(x => (x.qu_Id, x.ans_Title)).ToHashSet();

比使用散列集过滤列表

var userAnswers = lstGetUserAnswerIndex.Where(x => trueAnswers.Contains((x._Qu_Id, x._Title)));

答案 1 :(得分:1)

var userTrueAnswer = lstGetUserAnswerIndex.Where(w=> ListFinalTrueAnswer.Any(a=>a.qu_Id == w.qu_Id && a.ans_Title == w.ans_Title));

答案 2 :(得分:0)

首先,我们可以将公共获取者添加到我们的课程中。这是将字段设为私有并由公共获取者访问其值的更好方法:

public class UserAnswerToQue {
    // ...
    public int Qu_Id => this._Qu_Id;
    public string Title => this._Title;
    // ...
}

我们的虚拟输入答案列表:

List<UserAnswerToQue> lstGetUserAnswerIndex = new List<UserAnswerToQue>() {
    new UserAnswerToQue(1, "Water"),
    new UserAnswerToQue(2, "Metal"),
};
在第二个代码块中的

您的 ListFinalTrueAnswer 实际上是 Tuples 的列表。可以在这里确定:

select (x.qu_Id, x.ans_Title)

所以,让我们有一个虚拟列表,它代表您的元组列表:

var ListFinalTrueAnswer = new List<Tuple<int, string>>() {
    new Tuple<int, string> (1, "Water"),
    new Tuple<int, string> (2, "Wood"),
};

现在我们可以检查我们的虚拟输入答案列表:

lstGetUserAnswerIndex.Where(x => ListFinalTrueAnswer.Contains(new Tuple<int, string>(x.Qu_Id, x.Title)))

这种操作很丰富,因此我们可以稍微重写一下查询:

var ListFinalTrueAnswer2 = from x in FilteredTrueReceivedAnswerList select new { x.qu_Id, x.ans_Title }

我们现在有了一个IEnumarable匿名类。和我们的列表进行比较:

lstGetUserAnswerIndex.Where(x => ListFinalTrueAnswer2.Any(y => (y.qu_Id == x.Qu_Id) && (y.ans_Title == x.Title)))