简体   繁体   English

c#array帮助排序

[英]c# array help on sorting

First of all sorry for my mistakes in English its not my primary language 首先抱歉我的英语错误不是我的主要语言
i have a problem , i have a array like following 我有一个问题,我有一个像下面的阵列

string[] arr1 = new string[] { 
            "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
            "Pakistan:4,India:3,USA:2,Iran:1,UK:0", 
            "India:4,USA:3,Iran:2,UK:1,Pakistan:0" 
        };

now i just want to know that how many times Pakistan comes with 1 , 现在我只想知道巴基斯坦有多少次来1,
how many times with 2 , 3 , 4 and i need to know this about all India , USA , Iran , UK 有多少次2,3,4和我需要知道所有印度,美国,伊朗,英国

Thanks in advance , you guys are my last hope . 在此先感谢,你们是我最后的希望。

I would use the String.Split(char[]) method and the String.SubString(int, int) method to inspect every 'country' inside your array and to get the number postfix of each country. 我将使用String.Split(char [])方法和String.SubString(int,int)方法来检查数组中的每个“country”并获取每个国家/地区的数字后缀。

Try the following: 请尝试以下方法:

(The following code is now compiled and tested.) (现在编译并测试以下代码。)

Use a simple data structure to facilitate the task of holding the result of your operation. 使用简单的数据结构来完成保存操作结果的任务。

public struct Result {

    string Country { get; set; }
    int Number { get; set; }
    int Occurrences { get; set; }
}


// define what countries you are dealing with
string[] countries = new string[] { "Pakistan", "India", "USA", "Iran", "UK", }

Method to provide the overall result: 提供整体结果的方法:

public static Result[] IterateOverAllCountries () {

    // range of numbers forming the postfix of your country strings
    int numbersToLookFor = 4;        

    // provide an array that stores all the local results
    // numbersToLookFor + 1 to respect that numbers are starting with 0
    Result[] result = new Result[countries.Length * (numbersToLookFor + 1)];

    string currentCountry;

    int c = 0;

    // iterate over all countries
    for (int i = 0; i < countries.Length; i++) {

        currentCountry = countries[i];

        int j = 0;

        // do that for every number beginning with 0
        // (according to your question)

        int localResult;          

        while (j <= numbersToLookFor) {

            localResult = FindCountryPosition(currentCountry, j);

            // add another result to the array of all results
            result[c] = new Result() { Country = currentCountry, Number = j, Occurrences = localResult };

            j++;
            c++;
        }
    }

    return result;
}

Method to provide a local result: 提供本地结果的方法:

// iterate over the whole array and search the
    // occurrences of one particular country with one postfix number
    public static int FindCountryPosition (string country, int number) { 

        int result = 0;
        string[] subArray;

        for (int i = 0; i < arr1.Length; i++) {

            subArray = arr1[i].Split(',');

            string current;

            for (int j = 0; j < subArray.Length; j++) {

                current = subArray[j];
                if (
                    current.Equals(country + ":" + number) &&
                    current.Substring(current.Length - 1, 1).Equals(number + "")
                 ) 
                    result++;
            }
        }

        return result;
    }

The following should enable you to run the algorithm 以下应该可以让您运行算法

    // define what countries you are dealing with
    static string[] countries = new string[] { "Pakistan", "India", "USA", "Iran", "UK", };

    static string[] arr1 = new string[] { 
        "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
        "Pakistan:4,India:3,USA:2,Iran:1,UK:0", 
        "India:4,USA:3,Iran:2,UK:1,Pakistan:0" 
    };

    static void Main (string[] args) {


        Result[] r = IterateOverAllCountries();
    }

This linq will convert the array into a Dictionary>, where the outer dictionary contains the countries names, and inner dictionaries will contain the ocurrence number (the number after ':') and the count for each ocurrence. 此linq将数组转换为Dictionary>,其中外部字典包含国家/地区名称,内部字典将包含发生次数(':'后面的数字)和每个发生的计数。

string[] arr1 = new string[]
                            {
                                "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
                                "Pakistan:4,India:3,USA:2,Iran:1,UK:0",
                                "India:4,USA:3,Iran:2,UK:1,Pakistan:0"
                            };

var count = arr1
    .SelectMany(s => s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
    .GroupBy(s => s.Split(':')[0], s => s.Split(':')[1])
    .ToDictionary(g => g.Key,
         g =>
         {
              var items = g.Distinct();
              var result = new Dictionary<String, int>();
              foreach (var item in items)
                  result[item] = g.Count(gitem => gitem == item);
              return result;
         });

// print the result
foreach(var country in count.Keys)
{
     foreach(var ocurrence in count[country].Keys)
     {
          Console.WriteLine("{0} : {1} = {2}", country, ocurrence, count[country][ocurrence]);
     }
}

The data structure you are using is not rich enough to provide you with that information. 您使用的数据结构不够丰富,无法为您提供该信息。 Hence you need to parse your string and create a new data structure to be able to provide ( sring[][] ): 因此,您需要解析字符串并创建一个新的数据结构才能提供( sring[][] ):

        string[] arr1 = new string[] { 
        "Pakistan,India,USA,Iran,UK",
        "Pakistan,India,USA,Iran,UK", 
        "India,USA,Iran,UK,Pakistan" 
            };

        string[][] richerArray = arr1.Select(x=> x.Split('\'')).ToArray();
        var countPakistanIsFirst = richerArray.Select(x=>x[0] == "Pakistan").Count();

UPDATE UPDATE

You seem to have changed your question. 你似乎改变了你的问题。 The answer applies to the original question. 答案适用于原始问题。

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

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