using System.Collections.Generic;
public class InventoryInit
private static string[] HeaderData = GetSerializedPlayerInventoryHeaders().Split(',');
private static string[] InventoryData = GetSerializedPlayerInventory().Split("\n");
public static void Main()
for(int i = 0; i < HeaderData.Length; i++){
Console.Write(HeaderData[i]);
for(int i = 0; i < InventoryData.Length; i++){
Console.WriteLine(InventoryData[i]);
Console.WriteLine("------------------------------");
var weapons = InventoryData.Select(item => {
var fields = item.Split(',');
var hasLevel = Int32.TryParse(fields[2], out var level);
return new InventoryItem(fields[0], fields[1], hasLevel ? level : 0, fields[3]);
}).Where(i => i.Type == "WEAPON");
var bestWeapon = WeaponChooser.ChooseBestWeapon(weapons);
Console.WriteLine("Best weapon is {0}", bestWeapon);
public record InventoryItem(string ID, string Type, int WeaponLevel, string Quality);
public static class WeaponChooser
public static InventoryItem ChooseBestWeapon(IEnumerable<InventoryItem> inventoryItems)
if (inventoryItems is null || !inventoryItems.Any())
throw new InvalidOperationException("No items to choose from");
return inventoryItems.GroupBy(i => i.WeaponLevel, i => i).MaxBy(i => i.Key).FirstOrDefault();
private static string GetSerializedPlayerInventoryHeaders(){
return "ID,Category,Level,Quality";
private static string GetSerializedPlayerInventory(){
const string playerInventoryData = @"rusty_sword,WEAPON,1,Bronze
fire_sword,WEAPON,3,Silver
single_shoe,DEFENCE,1,Bronze
running_boots,DEFENCE,2,Gold
master_sword,WEAPON,10,Gold";
return playerInventoryData.Replace("\t", "");