如何计算列出的项目?

时间:2017-10-31 15:36:52

标签: c#

我有一个关于某些手机信息的txt文件。

Type;Size;Color;New-OrUsed;Warrantee(month);Price(HUF) 

iPhone SE;64;Gold;New;0;95000
iPhone 6S;64;Silver;New;3;130000
iPhone 5S;16;Black;New;5;60000
iPhone 5S;32;Gold;New;6;75000
iPhone 5S;32;RoseGold;New;8;66500
iPhone 7;32;Black;Used;10;135000
iPhone X;256;Silver;New;12;400000
iPhone 6S;128;Silver;New;3;173000
iPhone 8;128;Gold;New;12;256000
iPhone 7;64;Red;Used;4;155000
iPhone 8 Plus;64;Silver;New;4;285000
iPhone 6S Plus;64;Black;Used;8;180000
iPhone 7 Plus;32;Red;Used;6;192000

我想列出所有这些内容,如下所示:

键入(只有一次,无论其中有多少);文本有多少这种类型;该文本具有多少种颜色

iPhone 5S;3;3

我可以列出带有hashset的类型,但我不知道如何计算不同的颜色和类型的数量。

我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Collections;

namespace nyilvantartas
{
    class Program
    {
        struct adatok
        {
            public string tipus, szin, allapot;
            public int meret, garancia, ar;
        }

        static void Main(string[] args)
        {
            StreamReader f = new StreamReader("termekek.txt", Encoding.Default);
            HashSet<string> tipusok = new HashSet<string>();
            List<int> hanyvan = new List<int>();
            string[] hanyvann = new string[20];
            string s;
            string[] ss = new string[4];
            adatok[] adatok = new adatok[1000];
            int db = 0;
            s = f.ReadLine();
            while (!f.EndOfStream)
            {
                s = f.ReadLine();
                ss = s.Split(';');
                adatok[db].tipus = ss[0];
                adatok[db].meret = int.Parse(ss[1]);
                adatok[db].szin = ss[2];
                adatok[db].allapot = ss[3];
                adatok[db].garancia = int.Parse(ss[4]);
                adatok[db].ar = int.Parse(ss[5]);
                db++;
            }
            f.Close();
            int ezustar = 0, gari=0;
            double legolcsobb = 500000,legdragabb=0;
            for (int i = 0; i < db; i++)
            {
                tipusok.Add(adatok[i].tipus);
                if (adatok[i].szin=="Silver")
                {
                    ezustar += adatok[i].ar;
                }
                if (adatok[i].ar>legdragabb)
                {
                    legdragabb = adatok[i].ar;
                }
                if (adatok[i].ar<legolcsobb)
                {
                    legolcsobb = adatok[i].ar;
                }
                gari += adatok[i].garancia;
            }
            legdragabb /= legolcsobb;
            gari /= db;
            string[] tipusokk = new string[13];
            for (int i = 0; i < db; i++)
            {
                tipusok.Add(adatok[i].tipus);

            }
            for (int i = 0; i < db; i++)
            {
                hanyvann[i] = adatok[i].tipus;

            }


            Console.WriteLine("2.Feladat: {0} db iPhone található a listában.",+db);
            Console.WriteLine("3.Feladat: Az összes ezüst színű készülék {0} Ft-ba kerülne",+ezustar);
            Console.WriteLine("4.Feladat:");
            foreach (var item in tipusok)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("5.Feladat: Átlagossan {0} hónap garanciát kapunk",gari);
            Console.WriteLine("6.Felaadat: {0}-szor kerül többe a legdrágább a legolcsóbbnál.",legdragabb);

            Console.ReadKey();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

  1. 创建一个类来保存手机信息:

    class PhoneInfo {
        public string type;
        public int size;
        public string Color;
        public string newOrUsed;
        public int warrantyMonth;
        public decimal price;
    }
    
  2. 读入文本文件并创建List个对象。我建议阅读String.Split

    List<PhoneInfo> phones;
    
  3. 使用LINQ查询List

    var phoneCounts = from p in phones
                      group p by p.type into pg
                      select new {
                          type,
                          countOfType = pg.Count(),
                          countOfColors = pg.Select(p => p.color).Distinct().Count()
                       };
    

答案 1 :(得分:0)

我无法打开您发送的链接,您可以使用hashset或任何其他数据结构,但我更喜欢使用匿名数据,即使您可以构建自己的类并解析数据。

        var rawData = System.IO.File.ReadAllText("aa.txt");
        var data = rawData.Split(new[] {Environment.NewLine}, StringSplitOptions.None).Select(k =>
            { var segments = k.Split(';');
           return new
            {
                Type = segments[0],
                Size = segments[1],
                Color = segments[2],
                IsNew = segments[3],
                Warranty = segments[4],
                Price = segments[5]
            };});
        var report = data.GroupBy(k => k.Type).Select(p =>
            new
            {
                Type = p.Key,
                TypesCount = p.Count(),
                ColorVarityCount = p.Select(o => o.Color).Distinct().Count()
            });