Shos.Console 1.1.5

dotnet add package Shos.Console --version 1.1.5                
NuGet\Install-Package Shos.Console -Version 1.1.5                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Shos.Console" Version="1.1.5" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Shos.Console --version 1.1.5                
#r "nuget: Shos.Console, 1.1.5"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Shos.Console as a Cake Addin
#addin nuget:?package=Shos.Console&version=1.1.5

// Install Shos.Console as a Cake Tool
#tool nuget:?package=Shos.Console&version=1.1.5                

Shos.Console

Shos.Console

Summary

Console Library (.NET 8.0)

A library for Console.

NuGet

You can install Shos.CsvHelper to your project with NuGet on Visual Studio.

Package Manager

PM>Install-Package Shos.Console -version 1.1.5

.NET CLI

>dotnet add package Shos.Console --version 1.1.5

PackageReference

<PackageReference Include="Shos.Console" Version="1.1.5" />

Projects

Shos.Console

Library.

GridView
  • Draw a collection as a table to console
  • Support for full-width and half-width characters (所謂全角・半角文字対応)
  • for .NET 6.0 or later
ConsoleHelper
  • public static string ReadPassword(string message) ** Reads a password from the console input and returns its hashed value.
ColorSetter
  • A class that temporarily sets the console foreground and background colors.
JapaneseTextNormalizer
  • Provides methods to normalize Japanese text by converting inappropriate ASCII characters and half-width katakana to their appropriate forms.

Shos.Console.Sample

Sample for Shos.Console.

Shos.Console.Tests

Tests for Shos.Console.

Sample

See the sample: https://github.com/Fujiwo/Shos.Console/blob/main/Shos.Console.Sample/Program.cs


using System.Collections.Generic;
using System.Linq;

namespace Shos.Console.Sample
{
    // Japanese (日本語)
    class Program
    {
        static void 英数字記号のみの場合()
        {
            var staffs = new[] {
                new { Number = 101, Name = "Takuro Yoshida" , Email = "takuro.y@xxx.com"  , Score =   0.0 },
                new { Number = 111, Name = "Miyuki Nakajima", Email = "m.nakajima@xxx.com", Score =   8.3 },
                new { Number = 120, Name = "Sho Kiryuin"    , Email = "eiichi@xxx.com"    , Score =  99.7 },
                new { Number =   9, Name = "Kana Nishino"   , Email = "kana@xxx.com"      , Score = 100.0 }
            }.OrderBy(staff => staff.Number);

            GridView.Show(dataSource: staffs);
        }

        static void 所謂全角半角混じりの場合()
        {
            var 全社員 = new[] {
                new { 社員番号 = 101, 氏名 = "吉田 拓郎  ", フリガナ = "ヨシダ タクロウ" , メール = "takuro.y@xxx.com"  , 点数 =   0.0 },
                new { 社員番号 = 111, 氏名 = "中島 みゆき", フリガナ = "ナカジマ ミユキ" , メール = "m.nakajima@xxx.com", 点数 =   8.3 },
                new { 社員番号 = 120, 氏名 = "鬼龍院 翔"  , フリガナ = "キリュウイン ショウ", メール = "eiichi@xxx.com"    , 点数 =  99.7 },
                new { 社員番号 =   9, 氏名 = "西野 かな"  , フリガナ = "ニシノ カナ"    , メール = "kana@xxx.com"      , 点数 = 100.0 }
            }.OrderBy(社員 => 社員.氏名);

            GridView.Show(dataSource: 全社員, hasFrame: true);
        }

        class Staff
        {
            public int    Number         { get; set; }
            public string FamilyName     { get; set; } = "";
            public string GivenName      { get; set; } = "";
            public string FullName => $"{FamilyName} {GivenName}";
            public string FamilyNameRuby { get; set; } = "";
            public string GivenNameRuby  { get; set; } = "";
            public string FullNameRuby => $"{FamilyNameRuby} {GivenNameRuby}";
            public string Email          { get; set; } = "";
        }

        static void クラス利用の場合()
        {
            var staffs = new List<Staff> {
                new Staff { Number = 101, FamilyName = "吉田"  , GivenName = "拓郎  ", FamilyNameRuby = "ヨシダ"  , GivenNameRuby = "タクロウ", Email = "takuro.y@xxx.com"   },
                new Staff { Number = 111, FamilyName = "中島"  , GivenName = "みゆき", FamilyNameRuby = "ナカジマ" , GivenNameRuby = "ミユキ" , Email = "m.nakajima@xxx.com" },
                new Staff { Number =  12, FamilyName = "鬼龍院", GivenName = "翔"    , FamilyNameRuby = "キリュウイン", GivenNameRuby = "ショウ" , Email = "eiichi@xxx.com"     },
                new Staff { Number =   9, FamilyName = "西野"  , GivenName = "かな"  , FamilyNameRuby = "ニシノ"   , GivenNameRuby = "カナ"  , Email = "kana@xxx.com"       }
            };

            var scoreTable = new Dictionary<int, double> {
                { 101, 100.0 },
                { 111,  80.0 },
                {  12,   8.0 },
                {   9,   0.0 }
            };

            GridView.Show(
                dataSource: staffs.OrderBy(staff => staff.Number)
                                  .Select(staff => new {
                    社員番号 = staff.Number      ,
                    氏名     = staff.FullName    ,
                    フリガナ    = staff.FullNameRuby,
                    メール      = staff.Email       ,
                    得点     = scoreTable[staff.Number]
                }),
                hasFrame: true
            );
        }

        class Department
        {
            public int Code { get; set; }
            public string Name { get; set; } = "";
        }

        class Employee
        {
            public string Name { get; set; } = "";
            public int Number { get; set; }
            public Department? Department { get; set; }
        }

        static void クラスを2つ利用した場合()
        {
            var departments = new[] {
                new Department { Code = 1001, Name = "人事部"        },
                new Department { Code =  501, Name = "経理部"        },
                new Department { Code = 3001, Name = "R&D室"         },
                new Department { Code =   27, Name = "土木開発事業部"}
            };

            var staffs = new[] {
                new Employee { Name = "西村 要"    , Number =   3, Department = departments[0] },
                new Employee { Name = "川村 咲"    , Number = 101, Department = departments[1] },
                new Employee { Name = "東 さくら"  , Number =  40, Department = departments[1] },
                new Employee { Name = "柴咲 育三郎", Number =  27, Department = departments[2] }
            };

            System.Console.WriteLine("(1) GridView.Show(departments)");

            GridView.Show(dataSource: departments, hasFrame: true);

            System.Console.WriteLine("(2.1) GridView.Show(staffs)");

            GridView.Show(dataSource: staffs, hasFrame: true);

            System.Console.WriteLine("(2.2) GridView.Show(staffs.Select(...))");

            GridView.Show(
                dataSource: staffs.Select(staff => new { 名前 = staff.Name, 番号 = staff.Number, 部署 = $"{staff.Department?.Name ?? ""}({staff.Department?.Code})" }),
                hasFrame: true
            );

            System.Console.WriteLine("(2.3) staffs.Select(...).ShowTable() | Extension method version");

            // Extension method version
            staffs.OrderBy(staff => staff.Number)
                  .Select(staff => new { 名前 = staff.Name, 番号 = staff.Number, 部署 = $"{staff.Department?.Name ?? ""}({staff.Department?.Code})" })
                  .ShowTable();
        }
        
        static void カラム名ごとにデータを渡す場合()
        {
            var 全社員 = new (string, IEnumerable<object?>)[] {
                ("社員番号", new object[] { 101, 111, 120, 9, 100 }),
                ("氏名"   , new object[] { "吉田 拓郎", "中島 みゆき", "鬼龍院 翔", "西野 かな" }),
                ("フリガナ"   , new object[] { "ヨシダ タクロウ", "ナカジマ ミユキ", "キリュウイン ショウ", "ニシノ カナ" }),
                ("メール"   , new object[] { "takuro.y@xxx.com", "m.nakajima@xxx.com", "eiichi@xxx.com", "kana@xxx.com" }),
            };

            GridView.Show(dataSource: 全社員, hasFrame: true);
        }
        struct MenuItem
        {
            public enum Kind { 社員, 部署, その他 };

            public string Key { get; set; }
            public string Title { get; set; }
        }

        static void カラム名ごとにデータを渡す場合応用編()
        {
            var menuItems = new (MenuItem, MenuItem.Kind)[] {
                (new MenuItem { Key = "1", Title = "検索" }, MenuItem.Kind.社員),
                (new MenuItem { Key = "2", Title = "追加" }, MenuItem.Kind.社員),
                (new MenuItem { Key = "3", Title = "削除" }, MenuItem.Kind.社員),
                (new MenuItem { Key = "4", Title = "変更" }, MenuItem.Kind.社員),
                (new MenuItem { Key = "1", Title = "検索" }, MenuItem.Kind.部署),
                (new MenuItem { Key = "2", Title = "追加" }, MenuItem.Kind.部署),
                (new MenuItem { Key = "3", Title = "削除" }, MenuItem.Kind.部署),
                (new MenuItem { Key = "4", Title = "変更" }, MenuItem.Kind.部署),
                (new MenuItem { Key = "1", Title = "保存" }, MenuItem.Kind.その他),
                (new MenuItem { Key = "2", Title = "終了" }, MenuItem.Kind.その他)
            };

            var groups = menuItems.GroupBy(x => x.Item2);
            var dataSource = groups.Select(x => (x.Key.ToString(), x.Select(_ => (object?)$"({_.Item1.Key}){_.Item1.Title}")));
            dataSource.ShowTable(hasFrame: true);
        }

        static void Main()
        {
            new System.Action[] { 英数字記号のみの場合, 所謂全角半角混じりの場合, クラス利用の場合, クラスを2つ利用した場合, カラム名ごとにデータを渡す場合, カラム名ごとにデータを渡す場合応用編 }
            .ForEach((index, test) =>
            {
                System.Console.WriteLine($"■ Test {index + 1}");
                test();
                System.Console.WriteLine();
            });
        }
    }
}

Result:


■ Test 1
Number Name            Email              Score
     9 Kana Nishino    kana@xxx.com       100.0
   101 Takuro Yoshida  takuro.y@xxx.com     0.0
   111 Miyuki Nakajima m.nakajima@xxx.com   8.3
   120 Sho Kiryuin     eiichi@xxx.com      99.7

■ Test 2
+----------+-------------+------------+--------------------+-------+
| 社員番号 | 氏名        | フリガナ      | メール                | 点数  |
+----------+-------------+------------+--------------------+-------+
|      120 | 鬼龍院 翔   | キリュウイン ショウ | eiichi@xxx.com     |  99.7 |
|      101 | 吉田 拓郎   | ヨシダ タクロウ  | takuro.y@xxx.com   |   0.0 |
|        9 | 西野 かな   | ニシノ カナ     | kana@xxx.com       | 100.0 |
|      111 | 中島 みゆき | ナカジマ ミユキ  | m.nakajima@xxx.com |   8.3 |
+----------+-------------+------------+--------------------+-------+

■ Test 3
+----------+-------------+------------+--------------------+-------+
| 社員番号 | 氏名        | フリガナ      | メール                | 得点  |
+----------+-------------+------------+--------------------+-------+
|        9 | 西野 かな   | ニシノ カナ     | kana@xxx.com       |   0.0 |
|       12 | 鬼龍院 翔   | キリュウイン ショウ | eiichi@xxx.com     |   8.0 |
|      101 | 吉田 拓郎   | ヨシダ タクロウ  | takuro.y@xxx.com   | 100.0 |
|      111 | 中島 みゆき | ナカジマ ミユキ  | m.nakajima@xxx.com |  80.0 |
+----------+-------------+------------+--------------------+-------+

■ Test 4
(1) GridView.Show(departments)
+------+----------------+
| Code | Name           |
+------+----------------+
| 1001 | 人事部         |
|  501 | 経理部         |
| 3001 | R&D室          |
|   27 | 土木開発事業部 |
+------+----------------+
(2.1) GridView.Show(staffs)
+-------------+--------+----------------------------------------+
| Name        | Number | Department                             |
+-------------+--------+----------------------------------------+
| 西村 要     |      3 | Shos.Console.Sample.Program+Department |
| 川村 咲     |    101 | Shos.Console.Sample.Program+Department |
| 東 さくら   |     40 | Shos.Console.Sample.Program+Department |
| 柴咲 育三郎 |     27 | Shos.Console.Sample.Program+Department |
+-------------+--------+----------------------------------------+
(2.2) GridView.Show(staffs.Select(...))
+-------------+------+--------------+
| 名前        | 番号 | 部署         |
+-------------+------+--------------+
| 西村 要     |    3 | 人事部(1001) |
| 川村 咲     |  101 | 経理部(501)  |
| 東 さくら   |   40 | 経理部(501)  |
| 柴咲 育三郎 |   27 | R&D室(3001)  |
+-------------+------+--------------+
(2.3) staffs.Select(...).ShowTable() | Extension method version
+-------------+------+--------------+
| 名前        | 番号 | 部署         |
+-------------+------+--------------+
| 西村 要     |    3 | 人事部(1001) |
| 柴咲 育三郎 |   27 | R&D室(3001)  |
| 東 さくら   |   40 | 経理部(501)  |
| 川村 咲     |  101 | 経理部(501)  |
+-------------+------+--------------+

■ Test 5
+----------+-------------+------------+--------------------+
| 社員番号 | 氏名        | フリガナ      | メール                |
+----------+-------------+------------+--------------------+
|      101 | 吉田 拓郎   | ヨシダ タクロウ  | takuro.y@xxx.com   |
|      111 | 中島 みゆき | ナカジマ ミユキ  | m.nakajima@xxx.com |
|      120 | 鬼龍院 翔   | キリュウイン ショウ | eiichi@xxx.com     |
|        9 | 西野 かな   | ニシノ カナ     | kana@xxx.com       |
|      100 |             |            |                    |
+----------+-------------+------------+--------------------+

Author Info

Fujio Kojima: a software developer in Japan

  • Microsoft MVP for Development Tools - Visual C# (Jul. 2005 - Dec. 2014)
  • Microsoft MVP for .NET (Jan. 2015 - Oct. 2015)
  • Microsoft MVP for Visual Studio and Development Technologies (Nov. 2015 - Jun. 2018)
  • Microsoft MVP for Developer Technologies (Nov. 2018 - Jun. 2024)
  • MVP Profile
  • Blog (Japanese)
  • Web Site (Japanese)
  • Twitter
  • Instagram

License

This library is under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.5 109 8/28/2024
1.1.4 118 8/28/2024
1.1.3 117 8/9/2024
1.1.1 86 8/8/2024
1.1.0 91 8/8/2024
1.0.9 98 8/8/2024
1.0.8 101 8/8/2024
1.0.7 97 8/7/2024
1.0.6 95 8/7/2024
1.0.5 89 8/7/2024
1.0.4 97 8/7/2024
1.0.3 134 3/26/2024
1.0.2.1 463 6/16/2022
1.0.2 401 6/16/2022
1.0.1 406 6/16/2022
1.0.0 412 6/16/2022