簡體   English   中英

如何在c#中移動列表中的項目子集?

[英]How to move a subset of items in a list in c#?

我有以下清單:

List<string> l=new List<string()>{"a","b","c","d","1","2","3","4","a1","b2","c3","d4"};

我有oldIndexsizenewIndex

假設上面的列表oldIndex = 4 , size = 4 , newIndex = 0

我想要的輸出列表是:

{"1","2","3","4","a","b","c","d","a1","b2","c3","d4"};

我找到的解決方案是(不適用於所有情況):

for(int i=0;i<size;i++)
{
    if(oldIndex<newIndex)
    {
        var x=l[oldIndex];
        l.RemoveAt(oldIndex);
        l.Insert(newIndex+size-1,x);
    }
    else
    {
        var x=l[oldIndex+i];
        l.RemoveAt(oldIndex+i);
        l.Insert(newIndex+i,x);
    }
}

有沒有更好的方法,也許使用 LINQ 或更好的方法,或者以上是唯一的方法?

我從這個鏈接找到了上面的答案。 這個問題的不同之處在於我想移動一個塊,而不僅僅是單個元素。

您可以為此使用以下內容:

List<string> removedRange = l.GetRange(oldIndex, size);
l.RemoveRange(oldIndex, size);
l.InsertRange(newIndex, removedRange);

有許多不同的方法可以做到這一點。

Raviraj Palvankar 的答案可能是最簡單的,但為了補充它(並且因為您特別提到了 linq),這里有幾個(誠然有些過度設計的)替代方案。

List<string> l = new List<string>{"a","b","c","d","1","2","3","4","a1","b2","c3","d4"};

var oldIndex = 4;
var size= 4;
var newIndex = 0;

移動:

var toMove = l.Skip(oldIndex).Take(size).ToList();
var newList = l.Take(oldIndex).ToList().Concat(l.Skip(oldIndex + size)).ToList();

newList.InsertRange(newIndex, toMove);

如果您能夠移動{"a","b","c","d"} (需要知道不同的新索引,並且不需要oldIndex ,因為它將是 0),那么移動操作本身變得更容易:

var newIndex = 4; // Replace previous value which was 0
var size= 4; // Elements a - d

var newList = l.Skip(size).ToList();
newList.InsertRange(newIndex, l.Take(size));

...還有另一種方式(實際上可能是最簡單的閱讀方式):

var oldIndex = 4;
var size= 4;

var toMove = l.Skip(oldIndex).Take(size).ToList();
var firstPart = l.Take(oldIndex);
var lastPart = l.Skip(oldIndex + size);
var combined = toMove.Concat(firstPart).Concat(lastPart);

C#列表<object> .RemoveAll() - 如何刪除列表的子集?<div id="text_translate"><p> 我有兩個具有多個匹配屬性的<strong>feeds_Auto</strong>和<strong>Product</strong>類。 對於這個特殊問題,AutoID 是我需要使用的唯一字段。</p><p> 我有一個包含數百個<em>唯一</em>條目的List&lt;FeedsAuto&gt; 。 我有一個小List&lt;Product&gt;有 10、20 個<em>唯一</em>條目。 我現在想從大列表中刪除小列表中的所有項目。</p><p> 如何使用 RemoveAll({lambda expression}) 來完成此操作? 我發現的所有示例都依賴於簡單類型(字符串、整數等)的通用列表。</p><pre> private static int DoInserts(ref List&lt;Model.feeds_Auto&gt; source, ref List&lt;Model.Product&gt; target, Guid companyID) { List&lt;Model.Product&gt; newProductList = new List&lt;Model.Product&gt;(); List&lt;Model.Product&gt; dropSourceList = new List&lt;Model.Product&gt;(); using (var db = Helpers.GetProdDB()) { foreach (var src in source) { var tgt = target.Where(a =&gt; a.alternateProductID == src.AutoID &amp;&amp; a.LastFeedUpdate &lt; src.DateModified).FirstOrDefault(); if (tgt == null) { newProductList.Add(new Model.Product{...}); dropSourceList.Add(src); } } db.SaveChanges(); if (dropSourceList.Count &gt; 0) { source.RemoveAll(????); } } }</pre><p> 在循環中執行此操作並不困難:</p><pre> foreach (var drop in dropSourceList) { source.RemoveAll(a =&gt; a.AutoID == drop.AutoID); }</pre><p> (對我來說)循環一個集合以在每次傳遞中為一個項目調用 RemoveAll 只是沒有意義。</p></div></object>

[英]C# List<object>.RemoveAll() - How to remove a subset of the list?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何在控制台C#中的列表中移動光標? 在C#中的列表框之間移動項目 如何在C#中將所選項目從一個C1List移動​​到另一個? 如何將項目從列表移動到C#中的另一個列表? C# 在不改變相對位置的情況下按列表順序移動項目 在 C# 中將列表中的所有項目移動一個 position 的最佳方法 如何按最小到最大順序獲取項目並移動到臨時列表 C# C#列表<object> .RemoveAll() - 如何刪除列表的子集?<div id="text_translate"><p> 我有兩個具有多個匹配屬性的<strong>feeds_Auto</strong>和<strong>Product</strong>類。 對於這個特殊問題,AutoID 是我需要使用的唯一字段。</p><p> 我有一個包含數百個<em>唯一</em>條目的List&lt;FeedsAuto&gt; 。 我有一個小List&lt;Product&gt;有 10、20 個<em>唯一</em>條目。 我現在想從大列表中刪除小列表中的所有項目。</p><p> 如何使用 RemoveAll({lambda expression}) 來完成此操作? 我發現的所有示例都依賴於簡單類型(字符串、整數等)的通用列表。</p><pre> private static int DoInserts(ref List&lt;Model.feeds_Auto&gt; source, ref List&lt;Model.Product&gt; target, Guid companyID) { List&lt;Model.Product&gt; newProductList = new List&lt;Model.Product&gt;(); List&lt;Model.Product&gt; dropSourceList = new List&lt;Model.Product&gt;(); using (var db = Helpers.GetProdDB()) { foreach (var src in source) { var tgt = target.Where(a =&gt; a.alternateProductID == src.AutoID &amp;&amp; a.LastFeedUpdate &lt; src.DateModified).FirstOrDefault(); if (tgt == null) { newProductList.Add(new Model.Product{...}); dropSourceList.Add(src); } } db.SaveChanges(); if (dropSourceList.Count &gt; 0) { source.RemoveAll(????); } } }</pre><p> 在循環中執行此操作並不困難:</p><pre> foreach (var drop in dropSourceList) { source.RemoveAll(a =&gt; a.AutoID == drop.AutoID); }</pre><p> (對我來說)循環一個集合以在每次傳遞中為一個項目調用 RemoveAll 只是沒有意義。</p></div></object> 如何將 obj 移動到 c# 中的列表頂部 如何將列表項設置為null C#?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM