2017-06-02 75 views
-2

的選配項我有在2種不同類型的數組

string[] ColorsArray = new string[12] { "Blue", "Red", "Green", 
"Yellow", "Blue", "Green", "Blue", "Yellow", "Red", "Green", 
"Red", "Yellow" }; 

float[] LengthArray = new float[12] { 1.3f, 1.4f, 5.6f, 1.5f, 
3.5f, 5.4f, 1.2f, 6.5f, 4.4f, 4.1f, 3.3f, 4.9f }; 

我想匹配起來,使每個指數等於其他。所以ColorsArray [0]是藍色,等於LengthArray [0],它是1.3f

顏色是魚。所以每種顏色都是魚,每個相應的數字就是魚的長度。我需要能夠接受用戶給我的東西(藍色,紅色,綠色黃色),然後找出最大的魚是什麼。

目標是將它們全部匹配起來,然後能夠比較每種顏色的值。所以有4種顏色和3種副本,總計12個「魚」。

顯然可以使用For Loop,但我不知道如何。

+2

P租賃向我們展示您期望的結果。 – GregaMohorko

+0

你知道如何編寫'for'循環嗎? –

+0

你想爲兩者使用相同的索引,所以你需要一個'for'循環,然後在兩個數組中使用循環計數器作爲索引。但如前所述,既然你沒有描述你想如何合併這兩個項目,我們不能告訴你比這更進一步。 –

回答

0

下面的代碼發現的最大長度爲每條魚型:

var query = from 
    fish in ColorsArray.Select((t, i) => new { fishName = t, fishLength = LengthArray[i]}) 
    group fish by fish.fishName 
    into team 
    select new 
    { 
     fishName = team.Key, 
     maxLength = team.Max(item => item.fishLength) 
    }; 

    // get max length of fish by name 
    var maxLength = query.FirstOrDefault(fish => fish.fishName == "Blue")?.maxLength; 
0

您可以通過顏色的Dictionary結合長度,然後簡單地訪問它們。

var colors = new Dictionary<string,List<float>>(); 

for(int i = ColorsArray.Length-1; i >= 0; --i){ 
    string color = ColorsArray[i]; 
    float length = LengthArray[i]; 
    if(!colors.ContainsKey(color)){ 
     colors.Add(color, new List<float>()); 
    } 
    colors[color].Add(length); 
} 

// largest length of a specific color: 
float largestBlueLength = colors["Blue"].Max(); // 3.5 
float largestRedLength = colors["Red"].Max(); // 4.4 
// etc. 

// getting all lengths of a specific color: 
List<float> lengthsOfBlue = colors["Blue"]; // { 1.2, 3.5, 1.3 } 
List<float> lengthsOfRed = colors["Red"]; // { 3.3, 4.4, 1.4 } 
// etc. 
+0

有沒有一種方法可以在沒有字典或列表的情況下執行此操作? – Xoax

+1

詞典和/或列表有什麼問題?他們是簡單的集合。 – GregaMohorko

0

下面是一個簡單的擴展方法...

public static T2 ItemInOtherCollection<T1, T2>(this IEnumerable<T1> items, IEnumerable<T2> otherItems, T1 item) 
{ 
    var list = items.ToList(); 
    return otherItems.ElementAt(list.IndexOf(item)); 
} 

你可以使用它像這樣...

var item1 = LengthArray.ItemInOtherCollection(ColorsArray, 5.6f); 
var item2 = ColorsArray.ItemInOtherCollection(LengthArray, "Blue"); 
0

這裏有一個LINQ的解決方案:

Dictionary<string, float> biggestFishDictionary = ColorsArray 
    .Zip(LengthArray, (color, length) => new { color, length }) 
    .GroupBy(pair => pair.color) 
    .ToDictionary(g => g.Key, g => g.Max(pair => pair.length)); 

退貨{ { "Blue", 3.5f }, { "Red", 4.4f }, { "Green", 5.6f }, { "Yellow", 6.5f } }

0

因爲這看起來像功課,我們可能不應該幫助...

無需額外收藏等以及可能的.Net 1.0兼容:

string[] userFishes = Console.ReadLine().Split(','); 
string MaxFishName = ""; 
float MaxFishLength = 0; 

foreach (var userFish in userFishes) { 
    for (int j1 = 0; j1 < ColorsArray.Length; ++j1) { 
     if (ColorsArray[j1] == userFish) { 
      if (LengthArray[j1] > MaxFishLength) { 
       MaxFishLength = LengthArray[j1]; 
       MaxFishName = userFish; 
      } 
     } 
    } 
} 

Console.WriteLine(String.Format("User's largest fish is {0} at {1} feet", MaxFishName, MaxFishLength)); 

當然,我會重新命名您的變量是友好(ColorsArray會更佳爲FishNamesLengthArray(單數)爲FishLengths?),並在實際生活中使用LINQ:

var FishMaxLengthMap = FishNames.Zip(FishLengths, (fishName, fishLen) => new { fishName, fishLen }).GroupBy(fnl => fnl.fishName, (fishName, fnlg) => new { fishName, MaxLen = fnlg.Max(fnl => fnl.fishLen)}).ToDictionary(fnml => fnml.fishName.ToLower(), fnml => fnml.MaxLen); 

var userFishNames = Console.ReadLine().Split(',').Select(fn => fn.Trim().ToLower()); 

foreach (var fnl in userFishNames.Select(fn => new { fishName = fn, fishLen = FishMaxLengthMap[fn] }).Where(fml => fml.fishLen == userFishNames.Select(fn => FishMaxLengthMap[fn]).Max())) 
    Console.WriteLine($"Largest fish is {fnl.fishName} with length {fnl.fishLen} feet.");