C# 使用linq查询获取所有字典值

C# 使用linq查询获取所有字典值,c#,linq,C#,Linq,我有一份名单: private List_list1=new List(); 字符串keytookfor; 字符串值ToLookFor; 我想用LINQ搜索这个列表,检查第一个键是否已经存在,如果已经存在,它的值是否匹配valueToLookFor List.Add(new Tuple<string, string>("1", "data1")); List.Add(new Tuple<string, string>("2", "data2")); List.Add(n

我有一份名单:

private List_list1=new List();
字符串keytookfor;
字符串值ToLookFor;
我想用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"));
添加(新元组(“1”,“数据1”); 添加(新元组(“2”,“数据2”)); 添加(新元组(“2”,“数据3”)); 添加(新元组(“3”,“数据3”)); 所以在这个例子中,我想找到is“2”是否存在,并检查它的数据是否与我要查找的匹配。
我如何在LINQ中做到这一点?

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

Dictionary<string,string> _list1 = new Dictionary<string,string>();
if(_list1.containsKey(keyToLookFor)) {
   return _list1[keyToLookFor] == valueToLookFor;
}
Dictionary\u list1=newdictionary();
如果(_list1.containsKey(keytookfor)){
返回_list1[keytookfor]==valueToLookFor;
}

元组列表中的键不是唯一的,首先您可能需要使用

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


如果列表中可以有多个具有相同键值的元组

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

HashSet可以做到这一点(它可以处理重复项)。还值得注意的是,hashset是为高性能的set操作而设计的。如果您的列表1非常大,并且/或者您将对其执行频繁的查找,那么您应该使用哈希集

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
List list1=新列表();
列表1.Add(新元组(“1”,“data1”));
列表1.Add(新元组(“2”,“数据2”));
列表1.Add(新元组(“2”,“数据3”));
列表1.Add(新元组(“2”,“数据3”))//复制品
列表1.Add(新元组(“3”,“数据3”));
var hs=新哈希集(列表1);
var-toCheck=新元组(“2”,“数据3”);
控制台写入线(hs.Contains(toCheck))//真的
toCheck=新元组(“2”,“数据7”);
控制台写入线(hs.Contains(toCheck))//假的

为什么不创建一个类呢?我认为在您的情况下,创建一个类会容易得多。。你也做过关于如何使用Linq从元组中读取值的谷歌搜索吗。。如果你想对一个类执行此操作,请参阅前面的帖子-字典听起来像你在寻找的一样,字典可以有非唯一键吗???@HarryBoy不,它不能,但是您可以始终拥有一个
字典
我需要它不是唯一的,这就是我不使用字典的原因。@我以为HashSet是唯一需要不同值的类。如果您尝试向字典添加重复的键,您将得到ArgumentException。这是什么原因?是吗?@Edward这是一个问题,所以如果没有匹配项,你需要返回false吗?@Edward是的。如果没有匹配项,
SingleOrDefault
将返回null,
exists
将是
null==valueToLookFor
,这是
false
@Edward Yes,它将抛出
NullReferenceException
bool exists = _list1.Any(t => t.Item1 == keyToLookFor && t.Item2 == valueToLookFor);
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