パハットノート

主にUnity(C#)を中心としたプログラムの備忘録

C# List<string>から指定した文字列を含む要素のインデックスを取得




概要

LinqのWhere句を使用すればListから指定した文字列を含む要素を取得できますが、この方法では要素のインデックスを取得できません
そこで、拡張メソッドを使用してこの処理を実現しました。



作成した拡張メソッド

  • ContainFirstIndex」Listから指定した文字列を含む先頭の要素番号をint型で取得できます。ただし、指定した文字列を含む要素が存在しない場合は-1が戻り値となります。
  • ContainIndexs」ではListから指定した文字列を含む全ての要素番号をList型で取得できます。ただし、指定した文字列を含む要素が存在しない場合はnullが戻り値となります。
using System.Collections.Generic;

public static class ListStringExtensions
{
    //List<string>から指定した文字列を含む先頭の要素番号を取得
    public static int ContainFirstIndex(this List<string> list, string keyword, int startIndex = 0)
    {
        for (int i = startIndex; i < list.Count; i++)
        {
            if (list[i].Contains(keyword))
            {
                return i;
            }
        }
        return -1;
    }

    //List<string>から指定した文字列を含む全ての要素番号を取得
    public static List<int> ContainIndexs(this List<string> list, string keyword, int startIndex = 0)
    {
        List<int> indexList = new List<int>();

        for (int i = startIndex; i < list.Count; i++)
        {
            if (list[i].Contains(keyword))
            {
                indexList.Add(i);
            }
        }

        //空の場合はnullを返す
        if (indexList.Count == 0)
        {
            return null;
        }
        return indexList;
    }
}




使用例

①「ContainFirstIndex」の使用例

using System.Collections.Generic;
using System;

public class Sample1
{
    public static void Main()
    {
        List<string> strs = new List<string>()
        { 
            "本日は晴天なり", 
            "赤い靴", 
            "とうもろこし", 
            "My name is Bob", 
            "夕焼けは赤い", 
        };

        //ContainFirstIndexを使用
        Console.WriteLine("ContainFirstIndexのテスト");

        //「赤い」という単語を検索
        int i = strs.ContainFirstIndex("赤い");
        Console.WriteLine($"「赤い」を含んだ語を{i}番目で発見");

        //「赤い」という単語を検索(2番目の要素から検索)
        int j = strs.ContainFirstIndex("赤い", 2);
        Console.WriteLine($"2番目の要素から検索すると、「赤い」を含んだ語を{j}番目で発見");

        //「name」という単語を検索
        int k = strs.ContainFirstIndex("name");
        Console.WriteLine($"「name」を含んだ語を{k}番目で発見");

        //「青」という単語を検索(存在しない単語)
        int l = strs.ContainFirstIndex("青");
        Console.WriteLine($"「青」を含んだ語を{l}番目で発見");
    }
}


実行結果

ContainFirstIndexのテスト
「赤い」を含んだ語を1番目で発見
2番目の要素から検索すると、「赤い」を含んだ語を4番目で発見
「name」を含んだ語を3番目で発見
「青」を含んだ語を-1番目で発見




②「ContainIndexs」の使用例

using System.Collections.Generic;
using System;

public class Sample2
{
    public static void Main()
    {
        List<string> strs = new List<string>()
        {
            "本日は晴天なり",
            "赤い靴",
            "とうもろこし",
            "My name is Bob",
            "夕焼けは赤い",
        };

        //ContainFirstIndexを使用
        Console.WriteLine("ContainIndexsのテスト");

        //「赤い」という単語を検索
        List<int> list0 = strs.ContainIndexs("赤い");
        Console.WriteLine($"「赤い」を含んだ語を次の位置で発見");
        foreach (var i in list0)
            Console.Write($"{i}, ");

        //「赤い」という単語を検索(2番目の要素から検索)
        List<int> list1 = strs.ContainIndexs("赤い", 2);
        Console.WriteLine($"\n\n2番目の要素から検索すると、「赤い」を含んだ語を次の位置で発見");
        foreach (var i in list1)
            Console.Write($"{i}, ");

        //「name」という単語を検索
        List<int> list2 = strs.ContainIndexs("name");
        Console.WriteLine($"\n\n「name」を含んだ語を次の位置で発見");
        foreach (var i in list2)
            Console.Write($"{i}, ");

        //「青」という単語を検索(存在しない単語)
        List<int> list3 = strs.ContainIndexs("青");
        if (list3 == null)
            Console.WriteLine($"\n\n「青」を含んだ語は存在しない");
    }
}


実行結果

ContainIndexsのテスト
「赤い」を含んだ語を次の位置で発見
1, 4, 

2番目の要素から検索すると、「赤い」を含んだ語を次の位置で発見
4, 

「name」を含んだ語を次の位置で発見
3, 

「青」を含んだ語は存在しない