2

これは、匿名デリゲートを使用してプロパティのコレクションを検索するアプリケーションの現在のコードです。

public class MyObject
{
    public MyObject() { }

    public string MyObjectId { get; set; }
    public List<MySubObject> SubObjects { get; set; }
}

public class MySubObject
{
    public MySubObject() { }

    public string MySubObjectId { get; set; }
}

public List<MyObject> Search(string input)
{
    List<MyObject> AllObjects = Data.GetAllObjects();
    List<MyObject> SearchResults = new List<MyObject>();

    SearchResults = AllObjects.FindAll
    (
        delegate(MyObject o)
        {
            return e.MyObjectId.Equals(input)
        }
    );

    if (SearchResults .Count.Equals(0))
            SearchResults = null;

        return SearchResults ;
}

MySubObject.MySubObjectIdプロパティではなく、ジェネリック リストのプロパティで検索するように匿名デリゲートを変更したいと考えていMyObjectIdます。これを実現するには、匿名デリゲートのコードをどのように変更すればよいでしょうか?

4

3 に答える 3

1

以下を試してください

delegate(MyObject o) {
  var mySubObject = o as MySubObject;
  return mySubObject != null && mySubObject.MySubObjectId == input;
}

ここで短いラムダ構文を使用することもできることに注意してください

(o) => {
  var mySubObject = o as MySubObject;
  return mySubObject != null && mySubObject.MySubObjectId == input;
}

またはLINQクエリ

var searchResult = AllObjects
  .OfType<MySubObject>()
  .Where(x => x.MySubObjectId == input)
  .Cast<MyObject>()
  .ToList()
于 2013-04-03T20:32:27.317 に答える
1

これは大幅に削減できるように見えますがnull、リストへの割り当てを取り除く必要があります。

public List<MyObject> Search(string input)
{
    return Data.GetAllObjects()
        .Where(obj => obj.SubObjects
            .Any(subobj => subobj.SubOjectId.Equals(input)));
}

.Clear()より一貫性のある設計とはるかに少ない null チェックのために、リストを無効にする代わりにリストを作成します。

于 2013-04-04T12:33:57.733 に答える
1

ラムダ式を使用して、これを試してください。基本的に、サブオブジェクトの少なくとも 1 つに必要な入力が含まれている場合、オブジェクトが見つかります。

SearchResults = AllObjects.Where(obj => 
    obj.SubObjects != null 
    && obj.SubObjects.Any(subObj => ubObj.MySubObjectId.Equals(input))
).ToList();
于 2013-04-03T20:39:33.977 に答える