Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 要从哈希键集中列出的字典值_.net_Linq_Dictionary_Hashset - Fatal编程技术网

.net 要从哈希键集中列出的字典值

.net 要从哈希键集中列出的字典值,.net,linq,dictionary,hashset,.net,Linq,Dictionary,Hashset,希望这些评论能解释这个问题。我有一个很大的静态(在程序加载时使用新数据构建)字典,它被大量使用,我希望尽可能高效地引用它,而不是创建数据的副本并消耗内存。有一个hashset,它表示字典的一个子集,我需要将它表示为一个排序的值列表。新的HashSet或对HashSet的更改,然后我构建一个新类来包装下面的代码。有没有更好的办法?我不知道如何在LINQ中使用外部哈希集 // FTSwordIDs is a hashset and is also used elsewhere - a lot - h

希望这些评论能解释这个问题。我有一个很大的静态(在程序加载时使用新数据构建)字典,它被大量使用,我希望尽可能高效地引用它,而不是创建数据的副本并消耗内存。有一个hashset,它表示字典的一个子集,我需要将它表示为一个排序的值列表。新的HashSet或对HashSet的更改,然后我构建一个新类来包装下面的代码。有没有更好的办法?我不知道如何在LINQ中使用外部哈希集

// FTSwordIDs is a hashset and is also used elsewhere - a lot - hashset for lookup speed
// dlFTSword is Dictionary<Int32, string> and is static and sorted by value (on load) 
// dlFTSword can contain over a million entries and is used a lot of places 
// need to refence it rather than build a new list and eat memory
words = new List<string>();
foreach(Int32 id in dlFTSword.Keys)
{
    if (FTSwordIDs.Contains(id)) words.Add(dlFTSword[id]);
}
return words;
//FTSwordIDs是一个hashset,也用于其他地方-很多-hashset以提高查找速度
//dlFTSword是字典,是静态的,按值排序(加载时)
//dlFTSword可以包含超过一百万个条目,并且在很多地方使用
//需要引用它,而不是建立一个新的列表并消耗内存
单词=新列表();
foreach(dlFTSword.Keys中的Int32 id)
{
如果(FTSwordIDs.Contains(id))words.Add(dlFTSword[id]);
}
返回单词;
时间是12毫秒

try
{
    sqlConRO1.Open();
    sqlCMDRO1.CommandText = "SELECT [ID], [word] FROM [FTSwordDef] WITH (NOLOCK); "; // ORDER BY [word]; ";
    SqlDataReader rdr = sqlCMDRO1.ExecuteReader();
    while (rdr.Read())
    {
        dlFTSword.Add(rdr.GetInt32(0), rdr.GetString(1));
    }
    rdr.Close();
    Debug.WriteLine("dlFTSword.Count = " + dlFTSword.Count.ToString());

}
catch (Exception Ex) { throw new Exception("InitializeData Failed " + Ex.Message); }
finally { sqlConRO1.Close(); }

HashSet<Int32> wordIDs = new HashSet<int>() { 1, 100000, 200000, 300000, 400000, 500000, 600000 };
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

//List<string> words = dlFTSword.Where(pair => wordIDs.Contains(pair.Key))
//         .Select(pair => pair.Value)
//         .OrderBy(x => x)
//         .ToList();
//List<string> words = wordIDs.Where(key => dlFTSword.ContainsKey(key))
//          .Select(key => dlFTSword[key])
//          .OrderBy(value => value)
//          .ToList();
IEnumerable<string> words = wordIDs.Where(key => dlFTSword.ContainsKey(key))
          .Select(key => dlFTSword[key])
          .OrderBy(value => value);
DateTime dtEnd = DateTime.Now;
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Debug.WriteLine(ts.Milliseconds.ToString());
试试看
{
sqlConRO1.Open();
sqlCMDRO1.CommandText=“从[FTSwordDef]中选择[ID],[word],并使用(NOLOCK);;//按[word];”排序;
SqlDataReader rdr=sqlCMDRO1.ExecuteReader();
while(rdr.Read())
{
添加(rdr.GetInt32(0),rdr.GetString(1));
}
rdr.Close();
Debug.WriteLine(“dlFTSword.Count=“+dlFTSword.Count.ToString());
}
catch(Exception Ex){抛出新异常(“InitializeData失败”+Ex.Message);}
最后{sqlConRO1.Close();}
HashSet wordIDs=newhashset(){1,100000,200000,300000,400000,500000,600000};
秒表秒表=新秒表();
秒表。开始();
//List words=dlFTSword.Where(pair=>wordIDs.Contains(pair.Key))
//.Select(pair=>pair.Value)
//.OrderBy(x=>x)
//.ToList();
//List words=wordid.Where(key=>dlFTSword.ContainsKey(key))
//.选择(键=>dlFTSword[键])
//.OrderBy(值=>value)
//.ToList();
IEnumerable words=wordid.Where(key=>dlFTSword.ContainsKey(key))
.选择(键=>dlFTSword[键])
.OrderBy(值=>value);
DateTime dtEnd=DateTime.Now;
秒表;
TimeSpan ts=秒表。已用时间;
Debug.WriteLine(ts.millizes.ToString());
听起来你想要:

var words = dlFTSword.Where(pair => FTSwordIDs.Contains(pair.Key))
                     .Select(pair => pair.Value)
                     .ToList();
请注意,这样可以避免在发现每个键存在后对其执行查找。实际上,我们不会在字典中查找任何内容。它也不涉及创建任何其他集,而这些集是
相交的

但这值得检查:

dlFTSword是字典,是静态的,按值排序(加载时)

如果它是
词典
,那么它就不会被排序。没有“排序的”
词典
这样的概念。你可以使用
排序词典
排序列表
,但它们都不同于
词典

编辑:如果哈希集非常小,则对其进行迭代比对字典中的每一对进行迭代更有意义:

var words = FTSwordIDs.Where(key => dlFTSword.ContainsKey(key))
                      .Select(key => dlFTSword[key])
                      .OrderBy(value => value)
                      .ToList();

必须进行查找有点难看,但速度会快得多。

我担心这一点,但SortedDictionary无法解决我的问题,因为我需要的是按值而不是键排序的输出。配对的技巧很好。我会测试它。那么对值排序的语法是什么?@Blam:对不起,聊天对我的用户来说并不太有效usage pattern.OK然后让我们取消锁定。我尝试了IEnumerable words=wordIDs.Where(key=>dlFTSword.ContainsKey(key))。选择(key=>dlFTSword[key])。OrderBy(value=>value);它降到了15毫秒。我只需要绑定到一个列表框,这样我想IEnumerable就可以了。见鬼,我对120毫秒很满意,但如果它能更快,我会测试你想要的任何东西。@bum:你是在用
DateTime。出于兴趣,现在用
来测量时间吗?15毫秒的倍数对我来说似乎很可疑:)如果是这样,试着用
Stopwatch
相反……那么我想你会发现它会稍微快一点。当然,只有用户体验才是真正重要的,所以如果你高兴的话…@Blam:我说的不是物理秒表-我说的是
System.Diagnostics.stopwatch
,它是专为测量事情需要多长时间而设计的,并且具有比传统秒表更高的分辨率<代码>日期时间。现在
var words = FTSwordIDs.Where(key => dlFTSword.ContainsKey(key))
                      .Select(key => dlFTSword[key])
                      .OrderBy(value => value)
                      .ToList();