C#で重複データが登録できないコレクション「HashSet」を試す。

コンピュータ

Dictionary<TKey, TValue>のキーだけのようなコレクションです。重複チェックに重宝しそうですので試してみます。

ファイル名:HashSetSample01.csproj


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

ファイル名:Program.cs


using System.Collections.Generic;

public class Program
{
    static void Main()
    {
        // HashSetを生成
        // Windowsのパス用なので大文字小文字を区別しない。StringComparer.OrdinalIgnoreCase
        var pathList = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

        // 既存でない場合、要素を登録する。
        var path1 = "hoo/bar/sample.txt";
        if (!pathList.Contains(path1))
        {
            pathList.Add(path1);
        }
        var path2 = "hoo/bar/sample2.txt";
        if (!pathList.Contains(path2))
        {
            pathList.Add(path2);
        }
        var path3 = "hoo/bar/SAMPLE2.txt";
        if (!pathList.Contains(path3))
        {
            // sample2.txtがすでに登録済みなので実行されない
            pathList.Add(path3);
        }
        // 要素をすべて取得する。
        foreach (var path in pathList)
        {
            Console.WriteLine($"{path}");
            // hoo/bar/sampl.txt
            // hoo/bar/sampl2.txt
        }

        // 要素を削除する。
        pathList.Remove(path1);
        // 要素数を取得する。
        Console.WriteLine($"pathList.Count:{pathList.Count}");
        // pathList.Count:1

        // 要素をすべてクリアする。
        pathList.Clear();
        // 要素数を取得する。
        Console.WriteLine($"pathList.Count:{pathList.Count}");
        // pathList.Count:0
    }
}

インデックスを持つわけではないので、要素を取得する場合は個別にアクセスする可能性は低く、foreachでコレクションを全部アクセスすることになると思います。

コメント