在列表中的列表中插入一项
本文关键字:列表 一项 插入 | 更新日期: 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
问题就在这里:
_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
。