Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查数组中元素对的数量?_C#_.net - Fatal编程技术网

C# 如何检查数组中元素对的数量?

C# 如何检查数组中元素对的数量?,c#,.net,C#,.net,我正试图解决一个问题,但似乎找不到正确的方法。例如:数组[]={1,1,1,1,2,3,3,4}。这里1对是2,3对是1。总共有3对。我正在努力解决这个问题。下面是当前的代码情况 static int PairCounter(int n, int[] ar) { int temp_n = 0; //store the array range with constrains Console.WriteLine("Enter the number of object: ")

我正试图解决一个问题,但似乎找不到正确的方法。例如:数组[]={1,1,1,1,2,3,3,4}。这里1对是2,3对是1。总共有3对。我正在努力解决这个问题。下面是当前的代码情况

static int PairCounter(int n, int[] ar) {
    int temp_n = 0;

    //store the array range with constrains
    Console.WriteLine("Enter the number of object: ");
    temp_n = Console.Convert.ToInt32(Console.ReadLine()); 
    if((temp_n >= 1) || (temp_n <= 100)){
        n = temp_n;
    }else{
        Console.WriteLine("Please enter a value less then 100 and greater then 1.");
        temp_n = Console.Convert.ToInt32(Console.ReadLine()); 
        if((temp_n >= 1) || (temp_n <= 100)){
            n = temp_n;
        }else{
                Console.WriteLine("Please rerun the code.");
            }
    }
    //Stores Array with constrains
    Console.WriteLine("Enter the number of array: ");
    int[] arr = new int[n];

    for(int i = 0; i<= n; i++){
        arr[i] = Console.Convert.ToInt32(Console.ReadLine()); 
        if((arr[i] >= 1) || (arr[i] <= 100)){
            ar[i] = arr[i];
        }else{
            Console.WriteLine("Please enter a value less then 100 and greater then 1.");
            arr[i] = Convert.ToInt32(Console.ReadLine()); 
            if((arr[i] >= 1) || (arr[i] <= 100)){
                ar[i] = arr[i];
            }else{
                    Console.WriteLine("Rerun the code");
                }
        }    
    }

    //copy the array to another array
    int[] array3 = new int[n];
    for(i=0;i<=n; i++)
    {
    array3[i]=ar[i];
    }
    int repeat_counter = 0;

    for(int i = 0; i<=n;i++){
        if(ar[i].Contains(array3[i])){
            repeat_counter++;
        }
    }
}
static int PairCounter(int n,int[]ar){
内部温度=0;
//使用约束存储数组范围
Console.WriteLine(“输入对象的编号:”);
temp\u n=Console.Convert.ToInt32(Console.ReadLine());

如果((temp_n>=1)| |(temp_n=1)| |(temp_n)带Linq,则非常简单:

var result = array.GroupBy(x => x).Select(x => new {num = x.Key, count = x.Count() / 2});
foreach(var item in result)
    Consolve.WriteLine($"{item.count} pair(s) of {item.num}");
要获取对的总数,请执行以下操作:

int total = array.GroupBy(x => x).Sum(x => x.Count());
Consolve.WriteLine($"{total} pair(s) in total");

您可以在一行程序中执行此操作:

var pairs = ii.GroupBy(i => i).Sum(g => g.Count() / 2);
但是,是的,在目前的情况下,使用linq是作弊。解决这一问题的一个简单方法是利用计算整数的优势。您可以使用数组跟踪任何给定数字的实例数,方法是使用该数字作为索引:

static int CountPairs(int[] array)
{
    var counter = new int[array.Length];

    foreach (var i in array)
    {
        counter[i] += 1;
    }

    var pairs = 0;

    foreach (var count in counter)
    {
        pairs += count / 2;
    }

    return pairs;
}
这也应该起到作用

当然,您可以将其推广到任何情况,但简单的数组将不再适用,您需要更复杂的东西:字典。但想法与前面的解决方案相同;只需跟踪您看到任何给定项的次数:

static int CountPairs<T>(IEnumerable<T> source)
{
    var counter = new Dictionary<T, int>();

    foreach (var item in source)
    {
        if (!counter.TryAdd(item, 1))
            counter[item] += 1;
    }

    var pairs = 0;

    foreach (var count in counter.Values)
    {
        pairs += count / 2;
    }

    return pairs;
}
static int CountPairs(IEnumerable源代码)
{
var counter=newdictionary();
foreach(源中的var项)
{
如果(!计数器TryAdd(第1项))
计数器[项目]+=1;
}
var对=0;
foreach(计数器值中的变量计数)
{
配对+=计数/2;
}
返回对;
}

但是……嗯,一旦到了这里,可能最好简单地使用linq one liner;)

“这里一对1是2,一对3是1。那么总共有3对”嗯,什么?我对你想要实现的目标没有任何线索。似乎很简单:计算每个数字出现的频率。除以2(整数会自动向下取整).总结一下。最难的部分应该是找出你什么时候达到了列表中的最高数字。但是这个列表看起来是有序的,所以应该只看最后一个数字。这是一个学校项目吗?因为如果不是(并且可以用任何方法解决)可以用一个非常简单的方法找到它Linq@HimBromBeere:它是两对1和一对3。总共是三对。或者至少这是我读到的。我猜一个数学术语可能类似于唯一对(所以1,1,1,1只包含2对,不超过8对)。类似于:
array.GroupBy(x=>x)。选择(x=>new){x.Key,x.Count()/2});
来自问题:“总共有3对”。看起来OP想要计算包含多个项目的组(我不确定)。如果是这样,您需要将
Sum
替换为
Count(g=>g.Count()>1)
。在任何情况下+1,我喜欢单行解决方案)