带有查询<int>字典<int,对象的值的列表的 LINQ>



我有一个查询问题。我有一个带int的List,想用它从字典中获取值。字典键是int,其中一些键具有列表项的值。我的问题是我如何从字典中取出这些对象,这些键与列表项相匹配。过去几年一直在编程JAVA,现在正在与LINQ作斗争:(

提前感谢

问题解决了。谢谢大家:)不知道如何结束这个话题。我从一年开始就在读stackoverflow,但这是我的第一篇文章。

您可以使用Linq将列表项与条目键上的dictionary KeyValuePair条目连接起来。然后从每个连接对中选择输入值:

var values = from l in list
join kvp in dictionary on l equals kvp.Key
select kvp.Value;

Lambda语法:

var values = list.Join(dictionary, l => l, kvp => kvp.Key, (l,kvp) => kvp.Value);

基本上:

var value = dictionary[integerKey];

或者:

if (dictionary.TryGetValue(integerKey, out value)) {
}

您还可以创建一个扩展方法:

public static class DictionaryExtensions
{
public static IEnumerable<TValue> FilterValuesBy<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IEnumerable<TKey> filter)
{
if (dictionary == null) throw new ArgumentNullException("dictionary");
if (filter == null) throw new ArgumentNullException("filter");
var coll = filter as ICollection<TKey> ?? new HashSet<TKey>(filter);
return dictionary.Where(kvp => coll.Contains(kvp.Key)).Select(kvp => kvp.Value); 
}
}

用法:

class Program
{
static void Main()
{
var dict = Enumerable.Range(0, 10).ToDictionary(x => x);
var filter = Enumerable.Range(0, 2);
foreach (var i in dict.FilterValuesBy(filter))
{
Console.WriteLine(i);
}
Console.ReadLine();
}
}

简单Linq方法链:

var dict = Enumerable.Range(0, 10).ToDictionary(x => x);
var filter = Enumerable.Range(0, 2).ToList();
var filtered = dict.Where(x => filter.Contains(x.Key)).Select(x => x.Value).ToList();

最新更新