从列表中排除一个项目(通过索引),并保留所有其他项目

23

有一个包含一些数字的List<int>。随机选择一个索引,这个索引将被单独处理(称为主索引)。现在,我想要排除这个特定的索引,并获取List的所有其他元素(称为从属元素)。

var items = new List<int> { 55, 66, 77, 88, 99 };
int MasterIndex = new Random().Next(0, items .Count);

var master = items.Skip(MasterIndex).First();

// How to get the other items into another List<int> now? 
/*  -- items.Join;
    -- items.Select;
    -- items.Except */

Join, Select, Except - 选择哪一个?如何操作?

编辑:不能从原始列表中删除任何项,否则必须保留两个列表。


2
我知道这是一个老问题,但考虑到它们与奴隶制的关联,也许值得考虑替换“主”和“从”这些术语 - 技术行业普遍正在远离这些术语。一些建议的替代方案:https://en.wikipedia.org/wiki/Master/slave_(technology)#Possible_replacement_conventions - Lou
公正的观点,@Lou。 - Ajay
3个回答

44

使用 Where 关键字:

var result = numbers.Where((v, i) => i != MasterIndex).ToList();

使用.NET Fiddle编写程序。


太好了!它完美无缺地工作。这种 Where 形式在文档中并不明显。 - Ajay
@Ajay - 文档已经在那里了,请查看我分享的“Where”链接,它是“Where”的第二个重载。 - Rahul Singh
2
是的。到这个时候,我已经在实际产品代码中使用了这种方法(显然不是整数列表)。 - Ajay

4
如果性能是一个问题,您可能更喜欢使用List.CopyTo方法,就像这样。
List<T> RemoveOneItem1<T>(List<T> list, int index)
{
    var listCount = list.Count;

    // Create an array to store the data.
    var result = new T[listCount - 1];

    // Copy element before the index.
    list.CopyTo(0, result, 0, index);

    // Copy element after the index.
    list.CopyTo(index + 1, result, index, listCount - 1 - index);

    return new List<T>(result);
}

这个实现比@RahulSingh的答案快了近3倍。


3
您可以从列表中删除主项,
List<int> newList = items.RemoveAt(MasterIndex);

RemoveAt()方法可以将列表中的一个元素移除,因此不必将原始集合分配给一个新的列表。调用RemoveAt()方法后,items.Contains(MasterItem)会返回false


需要两个列表。我需要保留原始的! - Ajay
1
@Ajay RemoveAt()从原始列表中移除了该项,因此不需要将其分配给新列表。调用RemoveAt()后,“items”将不再包含主项。 - Kurubaran
1
所以,你想让我再次从数据库、网络或文件中读取数据吗?那是不合适的。 - Ajay
@Ajay 刚刚看到你的编辑,你不想从原始列表中删除项目。 - Kurubaran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接