de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Dementic
Dementic
質問

Linq - 先祖がこれを含む場所を選択しますか?

時々、私はただ気が気になる...

私は簡単なクラスを持っています:

public class myClass
{
    public long Id { get; set; }
    public long ParentChannelId { get; set; }
}

私はクラスを含むリストを持っています:

List myItems = new List

さらにコードの下で、私はクラスでリストをフィードします。

今、私はリストから項目を削除したい。 しかし、アイテムは子供や孫などを持つことができるので... 私はすべての関連を削除したい..

次のようなことを考えていた: (擬似コード)

var List itemsToDelete = myItems.Where(i => i.Ancestors.Contains(myItemId));

しかし、私は本当にそれを正確に書く方法を知るために頭脳atmを持っていない:... \ 私は .Ancestors 関数を持っています... ちょうどlambda linqの助けが必要

public List Ancestors
{
    get
    {
        List result = new List();

        Channel channel = this;

        while (channel != null)
        {
            result.Add(channel);
            channel = myChannels.Where(c => c.ParentChannelId == this.Id).First();
        }
        result.Reverse();

        return result;
    }
}

EDIT: guess i did not explain myself as i should... i have all the properties like ancestors, children parent etc... i want to select all the classes that might contain the specific class...

0 2011-10-27T20:13:34+00:00 2
Yuval Itzchakov
Yuval Itzchakov
編集された質問 22日 11月 2014 в 2:54
プログラミング
linq
c#
lambda
Merlyn Morgan-Graham
27日 10月 2011 в 8:29
2011-10-27T20:29:57+00:00
さらに
ソース
編集
#56792273

私はあなたの質問、特に .Ancestors を持っていると言った最後の部分をもう一度読んだので、もっと意味があります。

削除するアイテムのリストを取得するには、これを行います:

List itemsToDelete = myItems
    .Where(i => i.Id == myItemId)
    .SelectMany(i => i.Ancestors)
    .Concat(myItems)//Want to delete these too, not just the ancestors
    .ToList()
    ;

次に結果を foreach して元のリストから削除します。

I'd suggest keeping these in a Dictionary or a HashSet instead of a list, since removal will be way faster.

For a HashSet, you'll have to implement Equals and GetHashCode, or create an IEqualityComparer implementation to provide those methods.

編集前:

I wouldn't write my code this way. I'd simply create a Dictionary instead of a list. It will do a lookup way faster than anything involving ancestors/tree traversal.

しかし、達成しようとしていることを達成する方法はここにあります:

Linq to ObjectsまたはLinq to Entitiesとは対照的に、Linq to Objectsを使用している場合は、正しいタイプの MyClass に Parent というプロパティを Id でそれらをリンクしようとしています。

それで、 Ancestors プロパティをかなり簡単に作ることができます:

public IEnumerable Ancestors
{
    get
    {
        MyClass current = this;

        while(current != null)
        {
            current = current.Parent;
            yield return current;
        }
    }
}

クラスを編集できない場合は、 GetAncestors という拡張メソッドを作成します。

次に、あなたの質問に書いたコードに非常によく似た何かを使うことができます:

List itemsToDelete = myItems
    .Where(i => i.Ancestors.Any(a => a.Id == myItemId))
    .ToList();

エンティティへのLinq

Linq to Entitiesを使用している場合は、 MyClass 型のナビゲーションプロパティを作成して親に移動し、同じことをします。これにより、再クエリが発生する可能性があることに注意してください。 Linqが階層クエリに変換できるかどうかは不明です。

2
0
Michael D. Irizarry
27日 10月 2011 в 8:21
2011-10-27T20:21:53+00:00
さらに
ソース
編集
#56792272

これは、私がハッシュセットとRemoveAllメソッドを使って行う方法です。

var itemsToDelete = new HashSet(otherItems);
myItems.RemoveAll(i => itemsToDelete.Contains(i));

RemoveAll Method
http://msdn.microsoft.com/en-us/library/wdka673a.aspx


1
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 17時間前
2
Hideo Nakagawa
登録済み 1日前
3
Sergiy Tytarenko
登録済み 3日前
4
shoxrux azadov
登録済み 5日前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属