0

ラムダ式の文字列のリストを含むディクショナリ内の値のインスタンスの数を取得するにはどうすればよいですか?

private Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();

エラーを取り除くには、以下を改善する必要があります。基本的に、文字列を文字列のリストと比較することはできません。

int count = dict.Values.Count(v => v == "specific value");
4

2 に答える 2

5

linqを使用していますか?もちろん。

 dict.Values.SelectMany( v => v).Where( v => v == "specific value").Count();

すなわち:

dict.Values.SelectMany( v => v).Count(  v => v == "specific value" );
于 2013-03-25T14:38:23.380 に答える
5

私はこのバージョンを使用します:

int count = dict.Count(kvp => kvp.Value.Contains("specific value"));

Contains()[編集]わかりました。アプローチとSelectMany()アプローチ(x86リリースビルド)を比較した結果を次に示します。

n1 = 10000、n2 = 50000:

Contains() took: 00:00:04.2299671
SelectMany() took: 00:00:13.0385700
Contains() took: 00:00:04.1634190
SelectMany() took: 00:00:12.9052739
Contains() took: 00:00:04.1605812
SelectMany() took: 00:00:12.8953210
Contains() took: 00:00:04.1356058
SelectMany() took: 00:00:12.9109115

n1 = 20000、n2 = 100000:

Contains() took: 00:00:16.7422573
SelectMany() took: 00:00:52.1070692
Contains() took: 00:00:16.7206587
SelectMany() took: 00:00:52.1910468
Contains() took: 00:00:16.6064611
SelectMany() took: 00:00:52.1961513
Contains() took: 00:00:16.6167020
SelectMany() took: 00:00:54.5120003

2番目の結果セットでは、n1とn2の両方を2倍にしました。これにより、合計で文字列の数が4倍になります。

両方のアルゴリズムの時間は4倍に増加しました。これは、両方がO(N)であることを示しています。ここで、Nは文字列の総数です。

そしてコード:

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

namespace Demo
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            var dict = new Dictionary<string, List<string>>();
            var strings = new List<string>();

            int n1 = 10000;
            int n2 = 50000;

            for (int i = 0; i < n1; ++i)
                strings.Add("TEST");

            for (int i = 0; i < n2; ++i)
                dict.Add(i.ToString(), strings);

            for (int i = 0; i < 4; ++i)
            {
                var sw = Stopwatch.StartNew();
                dict.Count(kvp => kvp.Value.Contains("specific value"));
                Console.WriteLine("Contains() took: " + sw.Elapsed);

                sw.Restart();
                dict.Values.SelectMany(v => v).Count(v => v == "specific value");
                Console.WriteLine("SelectMany() took: " + sw.Elapsed);
            }
        }
    }
}
于 2013-03-25T14:43:34.280 に答える