C# 如何比较字典键值和元组键值

C# 如何比较字典键值和元组键值,c#,asp.net,if-statement,C#,Asp.net,If Statement,我有一个元组x的列表,其中我得到的键和值是(45345,1),(54645,0),(45345,0) 我有一个DictionaryPathList,因为我得到的键和值是(45345,asdfsd234egsgdfgs56345),(54645,0dfsd234egsgdfgs563456),(45345,0dfsd234egsgdfgs56345234) 我正在努力 foreach (var item in PathList) { if (x.Equals(item

我有一个元组
x的列表,其中我得到的键和值是(45345,1),(54645,0),(45345,0) 我有一个
DictionaryPathList
,因为我得到的键和值是(45345,asdfsd234egsgdfgs56345),(54645,0dfsd234egsgdfgs563456),(45345,0dfsd234egsgdfgs56345234)

我正在努力

    foreach (var item in PathList)
    {
       if (x.Equals(item.Key) && x[item.Key].Equals(0))
       {
         string path1 = Path.Combine(GetDirectory(item.Value), item.Value);
         File.Delete(path1);
       } 
    }
我想检查id的X是否与id的路径列表相同,并且值的X必须具有值0,然后在条件内输入。。。我现在所做的是,在任何情况下,我都无法进入If语句

如何检查我的状况

让我进一步解释一下:这是我返回一个元组列表,其中我得到了(54356,0),(64643,0),(34365,1)在我的ascx页面中,我有一个元组列表
x,在这个x中,我得到了列表的所有返回值,现在在同一个ascx页面中,我有
字典PathList
,我正在添加值ImgPathList.Add(54356456DFHGDFG6575DFGHDF);所以我得到了两个不同的列表,一个是x,另一个是路径列表


现在我想检查一下。如果pathlist具有id,而54356和x具有54356和0,则在if语句中输入,否则显示标签msg as file不能被删除

将断点放在条件上,循环直到得到应输入if语句的值,然后使用“Watch”查看表达式的哪个部分返回false调试窗口。

也许这是有用的: 在我的项目中,我有一本字典:

    public Dictionary<int, double> CpuDictionary = new Dictionary<int, double>();

ContainesKey函数对我来说非常适合。也许你应该尝试一下类似的方法。

我试图理解这个问题,但听起来我们有,比如:

var x = Tuple.Create(45345,0);
在这种情况下,您只需要:

string value;
if(PathList.TryGetValue(x.Item1, out value)) {
    // there is an item in the dictionary with key 45345;
    // the value is now in "value"
}
还有一些关于零支票的东西;不确定您的意思,但可能只需检查
x.Item2

如果
x
实际上是一个列表,则在循环中执行:

foreach(var item in list) {
    string value;
    if(PathList.TryGetValue(item.Item1, out value)) {
        // there is an element in the dictionary with key matching item;
        // the value is now in "value"
    }
}
这可能也是零检查的原因:

foreach(var item in list) {
    string value;
    if(item.Item2 == 0 && PathList.TryGetValue(item.Item1, out value)) {
        // there is an element in the dictionary with key matching item;
        // the value is now in "value"
    }
}

但是,我不能充分理解您给出的示例,因此我不能确定。

如果您想检查是否存在一个元组,该元组的字典键为
Item1
Item2==0

foreach(var item in pathList) { 
    var xItem = x.Find(i => i.Item1 == item.Key && i.Item2 == 0);
    if(xItem =! null) { 
        // YourTuple.Item1==item.Key && YourTuple.Item2==0 => true
    }
}

注意:在上面的示例中,您有两个相同的字典键

我已将代码修改为

 foreach (var item in PathList)
 {
    Tuple<int, int> temp = new Tuple<int, int>(item.Key, 0);
       //if (x.Equals(item.Key) && x[item.Key].Equals(0))
    if (x.Contains<Tuple<int, int>>(temp))
      {
         string path1 = Path.Combine(GetDirectory(item.Value), item.Value);
         File.Delete(path1);
       }
   }
foreach(路径列表中的变量项)
{
Tuple temp=新的Tuple(item.Key,0);
//如果(x.Equals(item.Key)&&x[item.Key].Equals(0))
如果(x.包含(温度))
{
字符串path1=Path.Combine(GetDirectory(item.Value)、item.Value);
删除(路径1);
}
}

我不知道这是不是一个好方法,但它解决了我的问题…

你能更清楚地说:什么是
x
?您对
x.Equals(item.Key)
x[item.Key]
的使用很奇怪。也;如果你在字典上循环,这通常意味着有些不对劲……你的示例代码中的x是什么?如果你的
x
Tuple
的列表,那么你不能将
x
item.Key
进行比较,因为
item.Key
int
。我说的是(
x.Equals(item.Key)
)yax是一个元组列表,那么在这种情况下我应该做什么呢?我猜if语句的第一个条件必须是:
x.Item1.Equals(item.Key)
x.Equals(item.Key)返回false,x[item.Key].Equals(0)给出异常x[item.Key].Equals(0)]x[item.Key]'引发了'System.ArgumentOutOfRangeException'类型的异常'bool@Rocky再说一遍:什么是
x
?x是一个元组列表,其中id为34234、65645、67567,每个id的SP返回值为0和1,因此它包含(34234,0)、(65645,1)我认为这里的问题是,您试图通过元组的键访问元组列表中的成员。这是不可能的。当您写入x[item.key]时,它返回x的元素号item.key-它不存在。相反,您可以使用LINQ,例如x.Where(i=>i.Item1==item.key)来查找相应的元组。此外,x.Equals(item.key)将始终返回false,因为x是一个列表,而item.key是一个单独的项。在字典上循环,然后在列表上使用
find
查找每个键是一种非常低效的方法;即
O(N*M)
。对比列表上的循环(
O(N)
)和使用字典进行查找(
O(1)
)-这就是
O(N)
。这是正确的。但是,从这个问题上看,OP到底想做什么还不清楚,所以我无法预测如何改进他的方法。因此,我把问题的标题作为要求。是的,这里的上下文令人痛苦地困惑——同意。
 foreach (var item in PathList)
 {
    Tuple<int, int> temp = new Tuple<int, int>(item.Key, 0);
       //if (x.Equals(item.Key) && x[item.Key].Equals(0))
    if (x.Contains<Tuple<int, int>>(temp))
      {
         string path1 = Path.Combine(GetDirectory(item.Value), item.Value);
         File.Delete(path1);
       }
   }