0

リストにこの問題があり、修正できないようです

次のメソッドを持つインターフェイスを実装するこのクラスがあります。

public List<T> CalculateWad<T, TH>(
    List<T> outputList,
    List<TH> inputList,
    bool flag)
{
    ...
}

これで、共通フィールド Contract を持つ outputlist と inputlist ができました。入力リストに存在するすべてのコントラクトを出力リストで削除する必要があります。

可能な限り一般的でなければなりません。リストのフィールドを取得できないようです。

何か案は?

4

3 に答える 3

3

Contractプロパティにアクセスするには、ジェネリックTとTHがContractプロパティとのインターフェイスを実装する必要があります。

ドキュメント:where(ジェネリック型制約)(C#リファレンス)

interface IContractable { string Contract { get; } }

次に、CalculateWadメソッドを含むクラスを次のように定義する必要があります。

class MyClass<T, TH>
    where T : IContractable
    where TH : IContractable
{
    public List<T> CalculateWad(List<T> outputList, List<TH> inputList, bool flag)
    {
        return outputList
                  .Where(o => 
                      inputList.Select(i => i.Contract).Contains(o.Contract) == false)
                  .ToList();
    }
}
于 2012-08-13T12:45:11.653 に答える
2

これは、実装する必要がある共通のインターフェイスを追加することにより、仕事に必要IHasContractです。TTH

class Program
{
    static void Main(string[] args)
    {
    }

    private IList<T> CalculateWad<T, TH>(IList<T> output,
        IList<TH> input, bool flag)
        where T : IHasContract
        where TH : IHasContract
    {
        var contracts = new HashSet<string >(input.Select(i => i.Contract));

        var qry = from o in output
                  where !contracts.Contains(o.Contract)
                  select o;

        return qry.ToList();
    }

    private sealed class Contract
    {

    }

    private interface IHasContract
    {
        string Contract { get; }
    }

    private sealed class Foo : IHasContract
    {
        public string Contract { get; set; }
    }

    private sealed class Bar : IHasContract
    {
        public string Contract { get; set; }
    }
}

テキストで言及したは変更されないことoutputに注意してください。ただし、リストの新しい変更されたコピーを返します。これは、メソッド シグネチャが説明するものである可能性があります。

于 2012-08-13T12:51:31.093 に答える
0

これがあなたのインターフェースです:

public List CalculateWad( List outputList, List inputList, bool flag) { ... }

そして、あなたはこれを行う必要がありますか?各リスト内のオブジェクトは equals メソッドで比較できると想定しています。

public List<T> CalculateWad<T, TH>( List<T> outputList, List<TH> inputList, bool flag) {

              // cast list to be regular object lists
              List out = (List) outputList;
              List in = (List) inputList;

              for(Object object : in){
                  out.remove(object);  // this looks for an object that matches using contract.equals(object)         
              }
}

フラグ変数とは何ですか?

于 2012-08-13T12:42:28.880 に答える