3
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
4

5 に答える 5

2

3つの可能性が思い浮かびます:

実装できます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);        
于 2012-11-11T19:05:19.257 に答える
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);
    }
}

これは 2 つのリスト間の参照比較を実行していることに注意してください。同じ値 (1、2、3) で別のリストを作成した場合、それは見つかりません。a.Values.SequenceEqual(b.Values)または同様のものを使用する必要があります。

于 2012-11-11T19:03:50.940 に答える
1

あなたt.Any(a=>a.val == b.val)は正しいです。

表示されるエラーは、コンパイラからではなく、デバッガーのクイック ウォッチまたは式ウィンドウからのものです。Visual Studio の式エバリュエーターはラムダを処理しません。ただし、これは依然として有効な C# コードであり、必要なことが行われます。

于 2012-11-11T19:02:49.393 に答える
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()メソッドはうまく機能するはずです。

于 2012-11-11T19:06:57.153 に答える
0


t.Contain(b)
を修正して、実装するクラスになる場所
t.Contains(b, new ItemEqualityComparer())からSystem.Linq
ItemEqualityComparerIEqualityComparer<Item>

于 2012-11-11T19:09:18.257 に答える