将元素插入到列表中(如果 C# 满足条件)
本文关键字:如果 满足 条件 元素 插入 列表 | 更新日期: 2023-09-27 18:30:43
如果没有这样的数字,如何在列表中间插入一些数字?
在下面的示例中,我尝试插入数字 4
List<int> list1 = new List<int>(){ 0, 1, 2, 3, 5, 6 };
int must_enter = 4;
if (!list1.Contains(must_enter))
{
list1.Add(must_enter);
}
由于结果编号将在列表末尾输入,但我希望在 3 之后(在 5 之前)立即输入。
请注意,由于项目的特殊性,我不能使用排序列表,但列表中的所有数字都保证按升序排列(0,2,6,9,10,...)
编辑:我知道一个错误,这就是我所做的:
List<int> list0 = new List<int>() { 1, 2, 3, 5, 6 };
int must_enter = 7;
if (!list0.Contains(must_enter))
{
if (must_enter < list0.Max())
{
int result = list0.FindIndex(item => item > must_enter || must_enter > list0.Max());
list0.Insert(result, must_enter);
}
else
{
list0.Add(must_enter);
}
}
edit2:无论如何,由于多种因素,我已经切换到二进制搜索方法。大家感谢您的帮助!
你可以做这样的事情:
int index = list1.BinarySearch(must_enter);
if (index < 0)
list1.Insert(~index, must_enter);
这样,您将以最佳性能对列表进行排序。
你可以做:
list1.Add(must_enter);
然后对列表进行排序:
list1 = list1.OrderBy(n => n).ToList();
结果将是:
0, 1, 2, 3, 4, 5, 6
编辑:
或者使用扩展方法:
static class Utility
{
public static void InsertElement(this List<int> list, int n)
{
if(!list.Contains(n))
{
for(int i = 0; i < list.Count; i++)
{
if(list[i] > n)
{
list.Insert(i-1, n);
break;
}
if(i == list.Count - 1)
list.Add(n);
}
}
}
}
然后:
list1.InsertElement(must_enter);
您正在寻找
list1.Insert(index, must_enter);
在特定索引处而不是列表末尾插入元素。
您必须首先找到要插入的索引,这可以通过二进制搜索轻松完成。从列表中间的值开始,并将其与要插入的数字进行比较。如果较大,则搜索列表的下半部分,如果较大,则搜索列表的上半部分。重复该过程,每次将列表分成两半,直到找到前面的项目小于您要插入的项目并且之后的项目大于您要插入的项目的位置。(编辑:当然,如果你的列表总是很小,那么从头开始迭代列表以找到正确的位置可能会不那么麻烦!
List<int> list1 = new List<int>() { 0, 1, 2, 3, 5, 6 };
int must_enter = 4;
for (int i = 0; i < list1.Count; i++)
{
if (must_enter >= list1[i])
{
list1.Insert(i + 1, must_enter);
}
}
编辑:我喜欢sarwar026,实施得更好。
list1.Insert(4, 4)
List<T>.Insert Method
- 将元素插入到列表中指定索引处。
快速说明-在许多情况下,列表类型上的插入实例方法的性能不佳。因为对于插入,列表必须调整以下元素。
这是我得到这个答案的原始帖子 尝试一下可能会对您有所帮助: 查找列表中元素的最佳位置
List<int> list = new List<int>{0,2,6,9,10};
for (int i = 0; i < list1.Count; i++)
{
int index = list.BinarySearch(i);
if( i < 0)
{
int insertIndex = ~index;
list.Insert(insertIndex, i);
}
}
仅针对 OP 需要的一个缺失元素
int index = list.BinarySearch(4);
if( index < 0)
{
int insertIndex = ~index;
list.Insert(insertIndex, 4);
}
或
List<int> list1 = new List<int>() { 0,2,6,9,10 };
int must_enter = 4;
for (int i = 0; i < list1.Count; i++)
{
if (!list1.Contains(i))
{
list1.Insert(i , i);
}
}
仅针对操作需要的一个元素
if (!list1.Contains(4))
{
list1.Insert(4 , 4);
}
List<int> list1 = new List<int>(){ 0, 1, 2, 3, 5, 6 };
int must_enter = 4;
if (!list1.Contains(must_enter))
{
int result = list.FindIndex(item => item > must_enter);
if(result!=-1)
list1.Insert(result, must_enter);
else // must_enter is not found
{
if(must_enter > list.Max()) // must_enter > max value of list
list1.Add(must_enter);
else if(must_enter < list.Min()) // must_enter < min value of list
list1.Insert(0, must_enter);
}
}
首先,找到大于must_enter(4)的数字的索引,然后将must_enter插入到该位置
if (!list1.Contains(must_enter))
{
SortedSet<int> sorted = new SortedSet<int>( list1 );
sorted.Add( must_enter );
list1 = sorted.ToList();
}