public class Item
{
public List<int> val { get; set; }
public double support { get; set; }
}
我宣布变量:
List<Item> t = new List<Item>();
t.Add(new Item(){val = new List<int>(){1,2,3};support=.1);
var b = new Item();
b.val = t[0].val;
b.support=t[0].support;
t.Contain(b) // return false???
我尝试使用linq
t.Any(a=>a.val==b.val) // I'm get error Expression cannot contain lambda expressions
抱歉我的英文
答案 0 :(得分:2)
有三种可能性浮现在脑海中:
您可以实施IEquatable<T>
:
public class Item: IEquatable<Item>
{
public List<int> val { get; set; }
public double support { get; set; }
public bool Equals(Item other)
{
return
this.support == other.support &&
this.val.SequenceEqual(other.val);
}
}
现在t.Contains(b)
将返回true。
如果您无法修改Item
课程,则可以撰写自定义EqualityComparer:
public class ItemEqualityComparer : IEqualityComparer<Item>
{
private ItemEqualityComparer()
{
}
public static IEqualityComparer<Item> Instance
{
get
{
return new ItemEqualityComparer();
}
}
public bool Equals(Item x, Item y)
{
return
x.support == y.support &&
x.val.SequenceEqual(y.val);
}
public int GetHashCode(Item obj)
{
int hash = 27;
hash += (13 * hash) + obj.support.GetHashCode();
foreach (var item in obj.val)
{
hash += (13 * hash) + item.GetHashCode();
}
return hash;
}
}
然后t.Contains(b)
也会返回true
。
或者,如果您愿意,只需要天真地做:
List<Item> t = new List<Item>();
t.Add(new Item { val = new List<int>(){1,2,3}, support=.1 });
var b = new Item();
b.val = t[0].val;
b.support = t[0].support;
bool equals = t.All(item => item.support == b.support && item.val.SequenceEqual(b.val));
Console.WriteLine(equals);
答案 1 :(得分:1)
您的t.Any(a=>a.val == b.val)
是正确的。
您得到的错误来自调试器中的快速监视或表达式窗口,而不是来自编译器。 Visual Studio的表达式求值程序不处理lambdas。但是,它仍然是有效的c#代码,并且可以做你想要的。
答案 2 :(得分:1)
这是你的早期行,这是一个问题:
t.Add(new Item(){val = new List<int>(){1,2,3};support=.1);
这是各种不同语法位的混合。它应该是:
t.Add(new Item(){val = new List<int>(){1,2,3}, support=.1});
...虽然最好有更好的属性名称等等。然后剩下的应该有效 - 尽管你需要对Any
的结果做些什么。 Any
调用本身有效。这是一个简短但完整的程序:
using System;
using System.Collections.Generic;
using System.Linq;
public class Item
{
public List<int> Values { get; set; }
public double Support { get; set; }
}
class Test
{
static void Main()
{
List<Item> list = new List<Item>
{
new Item { Values = new List<int>{1, 2, 3},
Support = 0.1 }
};
var check = new Item { Values = list[0].Values,
Support = list[0].Support };
bool found = list.Any(a => a.Values == check.Values);
Console.WriteLine(found);
}
}
请注意,这是在两个列表之间执行引用比较 - 如果您创建了一个具有相同值(1,2,3)的不同列表,则无法找到。您需要使用a.Values.SequenceEqual(b.Values)
或类似的东西。
答案 3 :(得分:0)
您的Item
课程应该实现IEquatable
界面:
class Item : IEquatable<Item>{
public List<int> val { get; set; }
public double support { get; set; }
public bool Equals(Item item){
return this.support.Equals(item.support) && this.val.SequenceEqual(item.val);
}
}
然后Contains()
方法应该运行良好。
答案 4 :(得分:0)
您可以在t.Contain(b)
的情况下更正您的“t.Contains(b, new ItemEqualityComparer())
”左至System.Linq
。ItemEqualityComparer
将在你的班级,将实施IEqualityComparer<Item>