1

汎用ラッパーに渡される共通オブジェクトをチェックする必要がある 2 つのリストがあります。

最初のリスト ( selList) は型付きエンティティ リストです。このリストのIDフィールドは、作成されるリストの基本タイプに基づいて異なります。

2 番目のリスト ( ) は、 ID (int または文字列) と説明 (文字列) の 2 つのプロパティ {ID, DESC} を持つことがわかっているmasterList匿名です。IListこのリストで ID プロパティの値を取得できます。

マスター リストのアイテムが に含まれているかどうかを示すブール フィールドを持つマスター リストの拡張を返したいと思いますselList

私は、訪問者パターンの線に沿ったどこかにいると考えています。

 public class SelectionCriteria<T> : where T : class
 {
    public IList<T> EligibleList { get; private set; }
    public IList LookupList { get; private set; }
 }
 LookupList = new List<object>
              {
                  new { ID = "fid", DESC = "Record 1"},
                  new { ID = "Record2", DESC = "Record 2"},
                  new { ID = "Record3", DESC = "Record 3"},
                  new { ID = "Record4", DESC = "Record 4"},
              };
  EligibleList = new List<AssetClass>
                 {
                     new AssetClass { FEE_ID = "fid", ASSET_CLASS = "A" },
                 };

次の結果が得られるはずです。

  LookupList[0] == true
  LookupList[1] == false
  LookupList[2] == false
  LookupList[3] == false

この問題を解決するより良い方法はありますか?

4

2 に答える 2

2
var results = LookupList.Select(l => EligibleList.Any(e => e.FEE_ID==l.ID))
                       .ToList();
于 2013-01-08T18:33:16.110 に答える
0

これをの定義として使用するSelectionCriteria<T>

public class SelectionCriteria<T>
    where T : class
{
    public IList<T> EligibleList { get; private set; }
    public IList LookupList { get; private set; }

    public SelectionCriteria(IList lookupList, IList<T> eligibleList)
    {
        LookupList = lookupList;
        EligibleList = eligibleList;
    }

    public bool this[int index]
    {
        get
        {
            var element = LookupList[index];

            foreach (var item in EligibleList)
            {
                if (item.Equals(element))
                {
                    return true;
                }
            }

            return false;
        }
    }
}

そしてこれはの定義としてAssetClass

public class AssetClass : IEquatable<AssetClass>
{
    public string FEE_ID { get; set; }

    public string ASSET_CLASS { get; set; }

    public bool Equals(AssetClass other)
    {
        return !ReferenceEquals(other, null) && other.FEE_ID == FEE_ID && other.ASSET_CLASS == ASSET_CLASS;
    }

    //Check to see if obj is a value-equal instance of AssetClass, if it's not, proceed
    //  to doing some reflection checks to determine value-equality
    public override bool Equals(object obj)
    {
        return Equals(obj as AssetClass) || PerformReflectionEqualityCheck(obj);
    }

    //Here's where we inspect whatever other thing we're comparing against
    private bool PerformReflectionEqualityCheck(object o)
    {
        //If the other thing is null, there's nothing more to do, it's not equal
        if (ReferenceEquals(o, null))
        {
            return false;
        }

        //Get the type of whatever we got passed
        var oType = o.GetType();
        //Find the ID property on it
        var oID = oType.GetProperty("ID");

        //Get the value of the property
        var oIDValue = oID.GetValue(o, null);

        //If the property type is string (so that it matches the type of FEE_ID on this class
        //   and the value of the strings are equal, then we're value-equal, otherwise, we're not
        return oID.PropertyType == typeof (string) && FEE_ID == (string) oIDValue;
    }
}

次のように、ルックアップアイテムのリストに存在する適格なアイテムのリストにある要素を取得できます。

for (var i = 0; i < assetClassSelectionCriteria.LookupList.Count; ++i)
{
    Console.WriteLine("LookupList[{0}] == {1}", i, assetClassSelectionCriteria[i]);
}

反射の良さを見たくない場合は、次PerformReflectionEqualityCheckのように使用することもできますAssetClass

private bool PerformReflectionEqualityCheck(object o)
{
    if (ReferenceEquals(o, null))
    {
        return false;
    }

    dynamic d = o;

    try
    {
        return FEE_ID == (string) d.ID;
    }
    catch
    {
        return false;
    }
}

「マスターリストの拡張」が拡張メソッドを意味する場合SelectionCriteria<T>、結果を取得するためにインデクサーを宣言する代わりに、次のようにすることができます。

public static class SelectionCriteriaExtensions
{
    public static bool IsLookupItemEligible<T>(this SelectionCriteria<T> set, int index)
        where T : class
    {
        var element = set.LookupList[index];

        foreach (var item in set.EligibleList)
        {
            if (item.Equals(element))
            {
                return true;
            }
        }

        return false;
    }
}

そしてそれをこのように呼びます:

assetClassSelectionCriteria.IsLookupItemEligible(0);
于 2013-01-08T18:48:35.783 に答える