简体   繁体   English

如何根据索引比较两个列表

[英]How to compare two lists based on indexes

I have two lists which are identical in length.我有两个长度相同的列表。 If one list has 4 elements, other list has also 4 elements.如果一个列表有 4 个元素,则另一个列表也有 4 个元素。 List<string> multipleJMBGs and List<BundleSchedule> schedules List<string> multipleJMBGsList<BundleSchedule> schedules

I need to create a check method, which will be checking following:我需要创建一个检查方法,它将检查以下内容:

  • First check if there any duplicates in List<string> and if there is, then grab indexes from that query, and within these indexes check if schedules have same Id if schedules[x].Id == chedules[y].Id首先检查List<string>中是否有任何重复项,如果有,则从该查询中获取索引,并在这些索引中检查调度是否具有相同的 Id if schedules[x].Id == chedules[y].Id

  • there can be multiple same pairs, for example:可以有多个相同的对,例如:

"1111", "1111" (indexes [23],[41])
"12345", "12345" (indexes [3],[11])
"16872982342716", "16872982342716" (indexes [29],[33])

those are 3 pairs, so we need to groupBy, and extract their indexes (those numbers are just for example purposes):这些是 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;
        }
    }
}

Mine question is how to put in Select of GroupBy query also those indexes from a list?我的问题是如何输入 GroupBy 的 Select 查询以及列表中的那些索引?

How about:怎么样:

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;

You can get the index and value for each enumerable and perform a Join.您可以获取每个可枚举的索引和值并执行联接。 Fiddle: https://dotnetfiddle.net/0oDJMM小提琴: 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
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM