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));

бірақ нақты мағынасын қалай жазуды білу үшін миы бармын. Менде .Өрістердің функциясы бар ... 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
var list мазмұнын жою керек itemsToDelete?
қосылды автор dknaack, көзі
Ата-бабалардың мүлкі жоқ. Қосымша көз кодын беріңіз.
қосылды автор dknaack, көзі
@dknaack - жоқ, оны жою үшін арналармен толтырғым келеді.
қосылды автор Dementic, көзі
@BoltClock - Q-ге қосылды.
қосылды автор Dementic, көзі
@ sq33G - менің псевдониммен проблема .Тасқа элементтерді беру қажет, ал мен оны элемент идентификаторын тамақтандыруды қалаймын.
қосылды автор Dementic, көзі
@ sq33G: Ол, бұл жалған кодекс деп айтады, ол мұндай мүлікті жоқ деп ойлаймын. Мен жауап беруімде, мен «Менде бар .Джастиндер жұмыс істейді» деп айтқан жерін сағындық. Менің редакцияланған жауапты қараңыз.
қосылды автор Merlyn Morgan-Graham, көзі
Ancestors сипаты үшін код деген не?
қосылды автор BoltClock, көзі
Сондықтан күте ... Егер сіз мұны істегіңіз келсе, сіздің itemsToDelete pseudocode-ңызда не болды?
қосылды автор sq33G, көзі
... неліктен кодекс (бастапқыда) түпнұсқалық жазбада болғанда, бабалар жоқ? (демек төмендеу)
қосылды автор sq33G, көзі
Қазір мен LINQ-ның үлкен жанкүйерін және бәрін ойлаймын, бірақ мен санауға болатын мәселелерді шешудің жалғыз жолы деп санамаймын. Неғұрлым оңтайлы шешім кейбір хэштсты немесе тізімді құрастырудың орнына кірісті пайдаланады, кері қайтарады және қайтарады, қараңыз @Merlyn Morgan-Graham's answer
қосылды автор edvaldig, көзі

2 жауаптар

Мен сіздің мәселеңізді қайта оқып алдым, әсіресе соңғы бөлімді сізде . <�Аңыздар> , және қазір ол мағыналы етеді.

Жойылатын элементтер тізімін алу үшін мұны орындаңыз:

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 SQL немесе Linq to Entities) параметрін пайдалансаңыз, 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 to Entities

Егер сіз Linq қызметіне қолдансаңыз, ата-аналарға өту үшін MyClass түрінің шарлау сипатын жасаңыз және бірдей әрекетті орындаңыз. Бұл қайта сұраулар тудыруы мүмкін екенін ескеріңіз. Linq иерархиялық сұрауға сұрау немесе аударуға болатынын білмейміз.

2
қосылды
Менің ата-анам мен балаларым бар. Тек нақты сыныпты қамтитын барлық сыныптарды қалай таңдауға болатынын білуім керек.
қосылды автор Dementic, көзі
Мен терген кезде оны ұрып тастағаны үшін +1 :)
қосылды автор edvaldig, көзі

Міне осылай мен хэштс және RemoveAll әдісін қолданамын.

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

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

1
қосылды