【问题标题】:Comparing c# array to itself将 c# 数组与自身进行比较
【发布时间】:2018-08-09 02:01:24
【问题描述】:

我正在尝试解决可能是一项简单的任务,但我对此非常陌生,并且不太了解以复杂的方式处理数组。我试图弄清楚两个输入是否每个对应的数字总和为相同的数字(例如,123 和 321、1+3 2+2 和 1+3 都等于 4)。

到目前为止,我的代码已将每个输入分解为数组,我可以将这些数组求​​和为第三个数组,但我无法弄清楚如何自行检查它。我是否应该打扰第三个数组,并弄清楚如何在循环中检查数组的总和?

public static void Main()
{
    Console.Write("\n\n"); //begin user input
    Console.Write("Check whether each cooresponding digit in two intigers sum to the same number or not:\n");
    Console.Write("-------------------------------------------");
    Console.Write("\n\n");
    Console.Write("Input 1st number then hit enter: ");
    string int1 = (Console.ReadLine());//user input 1


    Console.Write("Input 2nd number: ");
    string int2 = (Console.ReadLine());//user input 2

    int[] numbers = new int[int1.ToString().Length]; //changing user inputs to strings for array
    int[] numbers2 = new int[int2.ToString().Length];
    for (int i = 0; i < numbers.Length; i++)
    {
        numbers[i] = int.Parse(int1.Substring(i, 1));//populating arrays
        numbers2[i] = int.Parse(int2.Substring(i, 1));
    }


    int[] numbers3 = new int[numbers.Length];

    for (int i = 0; i < numbers.Length; i++)
    {
        numbers3[i] = (numbers[i] + numbers2[i]);
    }
}

}

【问题讨论】:

    标签: c# .net arrays


    【解决方案1】:

    您可以即时创建集合...

    bool isEqual = Console.ReadLine()
                          .ToCharArray()
                          .Select(i => Convert.ToInt32(i.ToString()))
                          .Zip(Console.ReadLine()
                                      .ToCharArray()
                                      .Select(i => Convert.ToInt32(i.ToString())),
                               (i, j) => new
                               {
                                   First = i,
                                   Second = j,
                                   Total = i + j
                               })
                          .GroupBy(x => x.Total)
                          .Count() == 1;
    

    如果所有元素加起来的值相同,则输出将等于 true...

    测试用例:

    应该会成功

    12345
    54321
    

    应该失败

    12345
    55432
    

    为了理解上面的查询,我们把它分成几个部分。

    // Here I'm just converting a string to an IEnumerable<int>, a collection of integers basically
    IEnumerable<int> ints1 = Console.ReadLine()
                                    .ToCharArray()
                                    .Select(i => Convert.ToInt32(i.ToString()));
    
    IEnumerable<int> ints2 = Console.ReadLine()
                                    .ToCharArray()
                                    .Select(i => Convert.ToInt32(i.ToString()));
    
    // Zip brings together two arrays and iterates through both at the same time.
    // I used an anonymous object to store the original values as well as the calculated ones
    var zippedArrays = ints1.Zip(ints2, (i, j) => new
                                        {
                                            First = i,    // original value from ints1
                                            Second = j,   // original values from ints2
                                            Total = i + j // calculated value ints1[x] + ints2[x]
                                        });
    
    
    
    // if the totals are [4,4,4], the method below will get rid of the duplicates.
    // if the totals are [4,3,5], every element in that array would be returned
    // if the totals are [4,4,5], only [4,5] would be returned.
    var distinctByTotal = zippedArrays.GroupBy(x => x.Total);
    
    // So what does this tell us? if the returned collection has a total count of 1 item,
    // it means that every item in the collection must have had the same total sum
    // So we can say that every element is equal if the response of our method == 1.
    
    bool isEqual = distinctByTotal.Count() == 1;
    

    【讨论】:

    • 这对我来说非常有用,我经常看到 zip 使用了很多,而且只是经常得到这样的解释。谢谢!
    • 很好的解决方案。如果两个可枚举的长度可能不同,也请考虑github.com/morelinq/MoreLINQ/blob/master/MoreLinq/ZipLongest.cs
    • @mjwills 谢谢你的分享,它确实在我的脑海里闪过,想到如果两个系列的长度不同,但选择不追求它……我喜欢他们所做的它!
    【解决方案2】:

    您已经完成了 99% 的任务。只需丢失第三个数组并检查最终循环中的每个单独的总和。

    bool isOK = numbers.Length = numbers2.Length && numbers.Length > 0;
    if(isOK)
    {
        int expectedSum = numbers[0] + numbers2[0];
        for (int i = 1; i < numbers.Length; i++)
        {
            var sum = (numbers[i] + numbers2[i]);
            if(sum != expectedSum)
            {
                isOK = false;
                break;
            }
        }
    }
    Console.WriteLine(isOk ? "Good job." : "You got some learning to do.");
    

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2021-06-09
      相关资源
      最近更新 更多