Как сравнить два списка на основе индексов

#c# #.net #asp.net-mvc #linq

Вопрос:

У меня есть два списка, которые идентичны по длине. Если в одном списке 4 элемента, то в другом списке также 4 элемента. List<string> multipleJMBGs и List<BundleSchedule> schedules

Мне нужно создать метод проверки, который будет проверять следующее:

  • Сначала проверьте, есть ли дубликаты, List<string> и если есть, затем извлеките индексы из этого запроса и в этих индексах проверьте, имеют ли расписания одинаковый идентификатор if schedules[x].Id == chedules[y].Id
  • может быть несколько одинаковых пар, например:
 "1111", "1111" (indexes [23],[41])
"12345", "12345" (indexes [3],[11])
"16872982342716", "16872982342716" (indexes [29],[33])
 

это 3 пары, поэтому нам нужно сгруппировать их и извлечь их индексы (эти цифры приведены только для примера).:

 private bool CheckIfSameUsersHaveSameServices(List<string> multipleJMBGs, List<BundleSchedule> schedules)
{
    var duplicateJMBGs = multipleJMBGs.GroupBy(x => x)
                .Where(group => group.Count() > 1)
                .Select(group => new { jmbg = group.Key }).ToList();


           
    Dictionary<string, string> indexes = new Dictionary<string, string>();

    //fill in dictionary with indexes
    //23,41
    //3,11
    //29,33

    foreach (var pair in indexes)
    {
        var firstToCompare = schedules.ElementAt(Convert.ToInt32(pair.Key));
        var secondToCompare = schedules.ElementAt(Convert.ToInt32(pair.Value));

        //if only one compared pair has same serviceId, return true
        if (firstToCompare.ServiceTypeComplexityId == secondToCompare.ServiceTypeComplexityId)
        {
            return true;
        }
    }
}
 

Мой вопрос в том, как включить в выбор запроса GroupBy также те индексы из списка?

Ответ №1:

Как насчёт:

 Dictionary<string, int> jmbgIds = new Dictionary<string, int>(StringComparer.Ordinal);

for (int index = 0; index < multipleJMBGs.Count; index  )
{
    string jmbg = multipleJMBGs[index];
    int id = schedules[index].ServiceTypeComplexityId;
    if (jmbgIds.TryGetValue(jmbg, out var previousId))
    {
        if (previousId != id)
        {
            return false;
        }
    }
    else
    {
        jmbgIds.Add(jmbg, id);
    }
}

return true;
 

Комментарии:

1. спасибо, это работает, просто я немного изменил previousId == id => return true , и нижняя часть возвращает false

2. @Stefan0309 Я не был полностью уверен в вопросе и названии метода, хотите ли вы определить, все ли дубликаты (если таковые имеются) имеют одинаковый идентификатор или есть хотя бы один дубликат с одинаковым идентификатором . 🙂

Ответ №2:

Вы можете получить индекс и значение для каждого перечисляемого и выполнить объединение. Скрипка: https://dotnetfiddle.net/0oDJMM

 public static void Main()
{
    List<string> foo = new List<string>() {
        "1", "12", "123", "1234", "12345"
    };
    List<string> bar = new List<string>() {
        "123", "a", "b", "1", "12"
    };
    var foos = foo.Select((f, i) => new { idx = i, val = f });
    var bars = bar.Select((b, i) => new { idx = i, val = b });
    var indexes = foos.Join(bars, 
        f => f.val, 
        b => b.val, 
        (f, b) => new { idxA = f.idx, idxB = b.idx });
    
    foreach (var idxs in indexes) {
        Console.WriteLine("idxA: {0} idxB: {1}", idxs.idxA, idxs.idxB); // You can now access the indexes for the matching values
    }
}