首页 > 解决方案 > 在 C# 中查找给定的 2 个字符串数组中的位置和差异项

问题描述

string[] test1 = { "Alpha", "Beta", "Gamma", "Serial", "Beta","Power" };
string[] test2 = { "Alpha", "Gamma", "Serial", "Beta" };

需要输出:

test2数组中的位置 1缺少Beta

test2阵列中的位置 6缺少电源

在这里,即使是重复的,我们也不能忽略。即使重复记录中缺少一个,我们也需要确切的差异,就像这里我们有两次 Beta 但只有第一个位置丢失。

正在使用以下内容,但这有一种显示不同值的隐含方式,因此以下内容不会产生任何价值。

test1.Except(test2)

如果有人可以帮助我获得正确的代码吗?

标签: c#arraysstring

解决方案


我希望这对您有所帮助,但我确信有一个更简单的解决方案。

internal class Program
{
    private static void Main(string[] args)
    {
        string[] test1 = { "Alpha", "Beta", "Gamma", "Serial", "Beta", "Power" };
        string[] test2 = { "Alpha", "Gamma", "Serial", "Beta" };

        var groups = test1.Select((value, index) => new
        {
            Id = Guid.NewGuid(),
            Value = value,
            Total = test1.Count(x => x.Equals(value)),
            Indexes = test1.FindAllIndexof(value)
        }).GroupBy(x => x.Value).Select(x => x.First())
            .Union(test2.Select((value, index) => new
            {
                Id = Guid.NewGuid(),
                Value = value,
                Total = test2.Count(x => x.Equals(value)),
                Indexes = test2.FindAllIndexof(value)
            }).GroupBy(x => x.Value).Select(x => x.First())).ToList();

        var processedValues = new List<string>();
        foreach (var currentGroup in groups)
        {
            if (processedValues.Contains(currentGroup.Value))
                continue;

            var groupToCompare = groups.FirstOrDefault(x => x.Value == currentGroup.Value && x.Id != currentGroup.Id);
            if (groupToCompare == null)
            {
                Console.WriteLine($"{currentGroup.Value} is missing in positions {string.Join(",", currentGroup.Indexes)}");
            }
            else if (currentGroup.Total < groupToCompare.Total)
            {
                var differentIndexes = groupToCompare.Indexes.OrderByDescending(x => x).Skip(currentGroup.Indexes.Length - 1);
                Console.WriteLine($"{currentGroup.Value} is missing in positions {string.Join(",", differentIndexes)}");
            }
            else if (currentGroup.Total > groupToCompare.Total)
            {
                var differentIndexes = currentGroup.Indexes.OrderByDescending(x => x).Skip(currentGroup.Indexes.Length - 1);
                Console.WriteLine($"{currentGroup.Value} is missing in positions {string.Join(",", differentIndexes)}");
            }

            processedValues.Add(currentGroup.Value);
        }

        Console.ReadKey();
    }
}

public static class NumberExtensions
{
    public static int[] FindAllIndexof<T>(this IEnumerable<T> values, T val)
    {
        return values.Select((b, i) => object.Equals(b, val) ? i : -1).Where(i => i != -1).ToArray();
    }
}

结果:

位置 1 中缺少 Beta

位置 5 电源缺失


推荐阅读