【问题标题】:Get all Dictionary values using linq query使用 linq 查询获取所有字典值
【发布时间】:2016-09-02 04:28:10
【问题描述】:

我有一个 C# 列表:

private List<Tuple<string, string>> _list1 = new List<Tuple<string,string>>();
string keyToLookFor;
string valueToLookFor;

我想使用 LINQ 搜索这个列表,首先检查某个键是否已经存在,如果存在,它的值是否与 valueToLookFor 匹配。

List.Add(new Tuple<string, string>("1", "data1"));
List.Add(new Tuple<string, string>("2", "data2"));
List.Add(new Tuple<string, string>("2", "data3"));
List.Add(new Tuple<string, string>("3", "data3"));

所以对于这个例子,我想找到“2”是否存在,并检查它的数据是否与我正在寻找的匹配。 如何在 LINQ 中执行此操作?

【问题讨论】:

  • 为什么不创建一个类我认为在你的情况下它会容易得多..你也做过任何关于如何使用 Linq 从元组中读取值的谷歌搜索......如果你想这样做有一个类参考这个以前的帖子 - stackoverflow.com/questions/10597629/…
  • Dictionary 听起来像你要找的东西
  • 字典可以有非唯一键吗??
  • @HarryBoy 不,它不能,但你总是可以有一个Dictionary&lt;string, List&lt;string&gt;&gt;

标签: c# linq


【解决方案1】:

元组列表中的键不是唯一的,首先你可能想使用一个

Dictionary<string, string>()

但如果你想保留列表

_list1.Where( t => t.Item1 == keyToLookFor && t.Item2 == valueToLookFor );

【讨论】:

  • 我需要它不是唯一的,这就是我不使用字典的原因。
  • @我认为 HashSet 是唯一需要不同值的类
  • 如果您尝试将重复键添加到字典中,您将收到 ArgumentException
【解决方案2】:

如果您使用的是 C# 6(并且每个元组都有一个唯一的键值):

bool exists = _list1.SingleOrDefault(t => t.Item1 == keyToLookFor)?.Item2 == valueToLookFor;

如果您的列表可以包含多个具有相同键值的元组:

bool exists = _list1.Any(t => t.Item1 == keyToLookFor && t.Item2 == valueToLookFor);

【讨论】:

  • 是什么?做吗?
  • 所以如果没有匹配项,你需要返回 false 吗?
  • @Edward 没错。如果没有匹配,SingleOrDefault 将返回 null,exists 将返回 null == valueToLookFor,即 false
  • @Edward 是的,它会抛出一个NullReferenceException
【解决方案3】:

HashSet 可以解决问题(它可以处理重复项)。还值得注意的是,HashSet 是为高性能集合操作而设计的。如果您的 list1 非常大并且/或者您将对其执行频繁的查找,您应该使用 HashSet。

List<Tuple<string, string>> list1 = new List<System.Tuple<string, string>>();
list1.Add(new Tuple<string, string>("1", "data1"));
list1.Add(new Tuple<string, string>("2", "data2"));
list1.Add(new Tuple<string, string>("2", "data3"));
list1.Add(new Tuple<string, string>("2", "data3")); //duplicate
list1.Add(new Tuple<string, string>("3", "data3"));

var hs  = new HashSet<Tuple<string, string>>(list1);

var toCheck = new Tuple<string,string>("2","data3");
Console.WriteLine(hs.Contains(toCheck)); //True
toCheck = new Tuple<string,string>("2","data7");
Console.WriteLine(hs.Contains(toCheck)); //False

【讨论】:

    【解决方案4】:

    你可能应该使用字典,而不是你描述的所有内容都是内置的

    Dictionary<string,string> _list1 = new Dictionary<string,string>();
    if(_list1.containsKey(keyToLookFor)) {
       return _list1[keyToLookFor] == valueToLookFor;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多