0

在使用 List 类时,我注意到我正在寻找的布尔值是:

 if(lstInts.Exists(x)){...}

X 是 T 的谓词,与 lstInts 相同。我很困惑为什么在这种情况下你不能将 int 传递给 int,以及为什么 X 的类型不是 T 类型。

示例我正在测试:

List<int> listInt = new List<int>();
int akey = Convert.toInt32(myMatch.Value);
Predicate<int> pre = new Predicate<int>(akey);  //akey is not the correct constructor param.
if(listInt.Exists(pre)){
   listInt.add(akey);
}

有没有理由有额外的谓词步骤,或者....如果我的逻辑不正确?

我还注意到谓词结构不采用 T 类型的项目。对于它是如何工作的有点困惑。

4

4 回答 4

3

您也可以使用Contains()方法

List<int> listInt = new List<int>();
int akey = Convert.toInt32(myMatch.Value);

if(listInt.Contains(akey)){
  listInt.add(akey); 
}

或者交替使用Any()

if(listInt.Any(I => I == akey)) { 
  // Do your logic 
}
于 2012-09-06T19:23:05.677 回答
2

Predicate<T>是一个委托(返回bool),它允许您找到一个符合某些条件的项目(这就是为什么要检查的项目被传递给它并作为一个参数)。

于 2012-09-06T19:23:21.887 回答
2

HashSet<T>对于不允许重复的集合类型(只是默默地忽略它们),这将是一个很好的用途。

于 2012-09-06T19:25:27.047 回答
1

好吧,对于您的场景,您应该在类上使用该Contains方法。List

那么你可能会问,存在的目的是什么?好吧,该Contains方法使用Equals对象上的方法来确定您正在检查的项目是否包含在列表中。这仅在类重写了Equals相等检查的方法时才有效。如果没有,那么您认为相等的事物的两个单独实例将不被视为相等。

除此之外,也许您想使用该Equals方法提供的不同逻辑。现在,确定列表中是否存在某些内容的唯一方法是自己迭代它,或者编写自己的 EqualityComparer 来检查实例的相等性。

因此,列表类所做的是公开一些方法,Exists以便您可以轻松地提供自己的逻辑,同时为您进行样板迭代。

例子

考虑您有一个Dog类型列表。现在,狗类已经覆盖了该Equals方法,所以没有办法检查一只狗是否与另一只狗相等,但他们有一些关于狗的信息,比如它的名字和主人。所以考虑以下

List<Dog> dogs = new List<Dog> {
    new Dog { Name = "Fido", Owner = "Julie" },
    new Dog { Name = "Bruno", Owner = "Julie" },
    new Dog { Name = "Fido", Owner = "George" }
};

Dog fido = new Dog { Name = "Fido", Owner = "Julie" };
  • List.Contains(fido)
    • 返回 false(因为Equals方法尚未被覆盖)
  • List.Exists(x => fido.Name == x.Name && fido.Owner == x.Owner)
    • 返回 true,因为您正在检查属性的相等性,这些属性是字符串,具有相等性覆盖。

如果您要查看列表类的源代码,您可能会看到类似这样的内容。

public bool Exists(Predicate<Dog> predicate) {
    foreach (Dog item in Items) {
        if (predicate(item))
            return true;
    }

    return false;
}

现在,如果您填写我上面的谓词,该方法将如下所示

public bool Exists(Dog other) {
    foreach (Dog item in Items) {
        if (item.Name == other.Name && item.Owner == other.Owner)
            return true;
    }

    return false;
}
于 2012-09-06T19:42:07.690 回答