Как сравнить два списка - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть список ответов, полученных от пользователей, как показано ниже:

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 ]

3 голосов
/ 29 апреля 2019

Создайте хэш-сет с идентификаторами истинных ответов на вопросы. (Чтобы получить быстрый поиск)

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 голос
/ 29 апреля 2019
var userTrueAnswer = lstGetUserAnswerIndex.Where(w=> ListFinalTrueAnswer.Any(a=>a.qu_Id == w.qu_Id && a.ans_Title == w.ans_Title));
0 голосов
/ 29 апреля 2019

Во-первых, мы можем добавить публичные методы получения в наш класс. Это лучший способ сделать поля приватными и получить доступ к их значениям с помощью общедоступных методов получения:

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 во втором блоке кода фактически является списком кортежей . Это можно определить здесь:

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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...