使用列表,您可以:
list.AddRange(otherCollection);
Run Code Online (Sandbox Code Playgroud)
HashSet中没有添加范围方法.将另一个集合添加到HashSet的最佳方法是什么?
c# vb.net observablecollection inotifycollectionchanged addrange
没有AddRange()
办法IList<T>
.
如何在IList<T>
不迭代项目和使用Add()
方法的情况下将项目列表添加到a ?
分析我的C#应用程序表明花费了大量时间List<T>.AddRange
.使用Reflector查看此方法中的代码表明它调用的List<T>.InsertRange
是这样实现的:
public void InsertRange(int index, IEnumerable<T> collection)
{
if (collection == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
}
if (index > this._size)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index);
}
ICollection<T> is2 = collection as ICollection<T>;
if (is2 != null)
{
int count = is2.Count;
if (count > 0)
{
this.EnsureCapacity(this._size + count);
if (index < this._size)
{
Array.Copy(this._items, index, this._items, index + count, this._size - index);
}
if (this == is2)
{
Array.Copy(this._items, 0, this._items, index, index);
Array.Copy(this._items, (int) (index + count), …
Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试将1个列表附加到另一个列表中.我之前使用它AddRange()
但它似乎没有在这里工作...这是代码:
IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(columnName, maxId - startId + 1, startId);
IList<E> resultCollection2 = ((IRepository<E, C>)this).SelectAll(columnName, endId - minId + 1, minId);
resultCollection.ToList().AddRange(resultCollection2);
Run Code Online (Sandbox Code Playgroud)
我做了调试以检查结果,这是我得到的:resultCollection
计数为4 resultCollection2
的计数为6,并且在添加范围后,resultCollection
仍然只有4,当它应该有10的计数.
谁能看到我做错了什么?任何帮助表示赞赏.
谢谢,
马特
我有以下场景,我想在列表中添加一些项目...
List<T> items = new List<T>();
IEnumerable<T> addItems = someCollection.Where(...);
items.AddRange(addItems);
Run Code Online (Sandbox Code Playgroud)
使用此代码,列表中不会添加任何项目,但如果我在Linq语句之后添加.ToList(),则会正确添加项目.我想这是由于延迟执行,但我想如果List.AddRange函数接受一个IEnumerable,它将枚举要添加的项目.
有人可以清楚为什么会这样吗?
我有一个定义如下的接口:
public interface TestInterface{
int id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
两个实现该接口的Linq-to-SQL类:
public class tblTestA : TestInterface{
public int id { get; set; }
}
public class tblTestB : TestInterface{
public int id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有来自tblTestA和tblTestB的数据库记录填充的IEnumerable列表a和b
IEnumerable<tblTestA> a = db.tblTestAs.AsEnumerable();
IEnumerable<tblTestB> b = db.tblTestBs.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)
但是,不允许以下内容:
List<TestInterface> list = new List<TestInterface>();
list.AddRange(a);
list.AddRange(b);
Run Code Online (Sandbox Code Playgroud)
我必须做如下:
foreach(tblTestA item in a)
list.Add(item)
foreach(tblTestB item in b)
list.Add(item)
Run Code Online (Sandbox Code Playgroud)
有什么我做错了吗?谢谢你的帮助
我有一个自定义BindingList,我想为其创建一个自定义的AddRange方法.
public class MyBindingList<I> : BindingList<I>
{
...
public void AddRange(IEnumerable<I> vals)
{
foreach (I v in vals)
Add(v);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是大型集合的性能很糟糕.我正在调试的情况是尝试添加大约30,000条记录,并花费了不可接受的时间.
在线查看此问题之后,似乎问题在于使用Add
每次添加时调整数组大小.我认为这个答案总结为:
如果您使用Add,它会根据需要逐渐调整内部数组的大小(加倍)
我可以在自定义AddRange
实现中做什么来指定BindingList需要根据项目数量调整大小,而不是让它在每个项目添加时不断重新分配数组?
如何将字符串拆分为List?我正在寻找相当于ToCharArray的东西,而是让它成为一个List.
string data = "ABCDEFGHIJ1fFJKAL";
List<string> datalist = new List<string>();
datalist.AddRange(new List<string>{"A","B","C"});
Run Code Online (Sandbox Code Playgroud)
你如何转换数据,以便AddRange接受?
我试图在 C# 中找到一个解决方案来扩展O(1)
.
List的AddRange()
方法当然是一个O(n)
操作。这应该是 LinkedList 支持的东西,但 LinkedList 没有像这样的方法AddRangeLast()
,并试图像这样组合 LinkedLists:
LinkedList<int> l1 = new LinkedList<int>(new[] { 1, 2, 3 });
LinkedList<int> l2 = new LinkedList<int>(new[] { 11, 12, 13 });
l1.AddLast(l1.First);
Run Code Online (Sandbox Code Playgroud)
抛出这个异常:
System.InvalidOperationException: 'LinkedList 节点已经属于 LinkedList。'
有没有人知道在O(1)
不自己实现 LinkedList 和 LinkedListNode 的情况下将列表添加到列表中的方法?
addrange ×10
c# ×10
list ×5
collections ×2
.net ×1
arrays ×1
asp.net-mvc ×1
bindinglist ×1
deferred ×1
hashset ×1
ienumerable ×1
linked-list ×1
linq ×1
performance ×1
repository ×1
vb.net ×1