在列表中的列表中插入一项

本文关键字:列表 一项 插入 | 更新日期: 2023-09-27 18:05:16

在阅读了List类一段时间后,我找不到任何解决这个问题的方法,我需要将值插入到主列表内的列表项中。

一个Person类的列表,在它内部保存另一个名为Blocks的列表,Blocks是一个int类型的块地址丢失,用于以后在工具中使用。

我尝试使用类List的插入方法将"block"的值插入到List Blocks中,如下所示:

_person.Insert(stuff, _person.Select(x => x.Blocks.Add(block)));

,其中是保存待插入值的整型类型。and stuff是IndexOf

找到的block的int索引

,但是在Select子句下面出现了一个错误,描述为

"错误8方法的类型参数"System.Linq.Enumerable.Select (System.Collections.Generic.IEnumerable,System.Func)'不能从用法中推断出来。试一试指定类型参数明确。C:'Users'User'documents'visual工作室2010'Projects'NOOP'NOOP_Tools'DLC.cs 112 39 NOOP_Tools"

正如我所理解的错误是在选择语句,但我不确定我在哪里出错…

PS,由于我的声誉不高,我无法对其中一个回答发表评论,这促使我去寻找其他答案,但却一无所获,因此,我不得不提出一个问题,以确保我知道我做错了什么。

thanks in advance

EDIT1

 public Action<Person, int> InsertBlockAction = (Class, block) => Class.Blocks.Add(block);
 public Action<Person, string> InserDataAction = (Class, data) => Class.Data = data;

我想这可能是答案。还需要测试一下

EDIT2 上面的动作只适用于List

在列表中的列表中插入一项

中的每个var项

问题就在这里:

_person.Select(x => x.Blocks.Add(block))

Select需要一个返回值的函数-您只是出于某些未知原因调用Add。由于Add不返回值,因此它不是有效的投影。

如果要操作列表中的特定项,则需要先选择它,因此:

var personToEdit = _person[stuff]; // You said 'stuff' is your index
personToEdit.Blocks.Add(block);

正如其他人所指出的,Select期望在执行投影时产生一个值。

根据我的理解,你真正想要的是一种简单的方法,在一个项目列表中添加一个内部列表。

我已经提出了以下扩展类:

public static class Extensions
{
    public static void AddNested<TOuter, TInner>(
        this IEnumerable<TOuter> outerItems,
        Func<TOuter, ICollection<TInner>> innerCollectionSelector,
        Func<TOuter, bool> outerPredicate,
        Func<TOuter, TInner> innerProducer
    )
    {
        foreach(var outer in outerItems)
        {
            innerCollectionSelector(outer).Add(innerProducer(outer));
        }
    }
    public static void AddNested<TOuter, TInner>(
        this IEnumerable<TOuter> outerItems,
        Func<TOuter, ICollection<TInner>> innerCollectionSelector,
        Func<TOuter, bool> outerPredicate,
        TInner innerItemToAdd
    )
    {
        outerItems.AddNested(innerCollectionSelector, outerPredicate, _ => innerItemToAdd);
    }
    public static void AddNested<TOuter, TInner>(
        this IEnumerable<TOuter> outerItems,
        Func<TOuter, ICollection<TInner>> innerCollectionSelector,
        TOuter outerItem,
        Func<TOuter, TInner> innerProducer
    )
    {
        outerItems.AddNested(innerCollectionSelector, i => i.Equals(outerItem), innerProducer);
    }
    public static void AddNested<TOuter, TInner>(
        this IEnumerable<TOuter> outerItems,
        Func<TOuter, ICollection<TInner>> innerCollectionSelector,
        TOuter outerItem,
        TInner innerItemToAdd
    )
    {
        outerItems.AddNested(innerCollectionSelector, outerItem, _ => innerItemToAdd);
    }
}

坚持你的人员和块列表,你可以这样做:

public void DoSomething()
{
    // Add a new block for everyone called Bob
    people.AddNested(p => p.Blocks, p => p.FirstName == "Bob", p => new Block("Block For Bob"));
    // Add a new block for Bob Mackey
    people.AddNested(p => p.Blocks, p => p.FirstName == "Bob" && p.Surname == "Mackey", 
        p => new Block());
    // Add for specific item
    var person = people.Single(p => p.Surname == "dfsdfdfsdf");
    var block = CreateBlockForPerson(person);
    people.NestedAdd(p => p.Blocks, person, block);
}

注意:我的例子中的最后一个场景只适用于people实际上包含person,它只是无声地失败将block添加到person