【问题标题】:Move list elements meeting condition to the top of the list将满足条件的列表元素移至列表顶部
【发布时间】:2017-04-15 00:44:21
【问题描述】:

我想将特定号码移到此列表的顶部。

int numberToBeMovedOnTop = 4;
List<int> lst = new List<int>(){1, 2, 3, 4, 5, 5, 4, 7, 9, 4, 2, 1};
List<int> lstOdd = lst.FindAll(l => l == numberToBeMovedOnTop);
lstOdd.AddRange(lst.FindAll(l => l != numberToBeMovedOnTop));

numberToBeMovedOnTop 是一个变量。

这给了我想要的结果,但这是一个更好的解决方案吗?我可以迭代列表一次并将numberToBeMovedOnTop 的第一次出现与第一个元素交换,将numberToBeMovedOnTop 的第二次出现与第二个元素交换,依此类推。但是,这可以通过一些内置的 C# 函数来完成,而无需两次迭代列表吗?

【问题讨论】:

标签: c#


【解决方案1】:

你可以使用 LINQ:

List<int> lstOdd = lst.OrderByDescending(i => i == numberToBeMovedOnTop).ToList();

为什么是OrderByDescending?因为比较返回一个bool 并且true 高于false。你也可以使用:

List<int> lstOdd = lst.OrderBy(i => i == numberToBeMovedOnTop ? 0 : 1).ToList();

请注意,这是因为OrderByOrderByDescending 正在执行stable sort。这意味着所有相同项目的原始顺序保持不变。


不管怎样,这里有一个扩展方法,它适用于任何类型和谓词,并且效率更高:

public static List<T> PrependAll<T>(this List<T> list, Func<T, bool> predicate)
{
    var returnList = new List<T>();
    var listNonMatch = new List<T>();
    foreach (T item in list)
    {
        if (predicate(item))
            returnList.Add(item);
        else
            listNonMatch.Add(item);
    }
    returnList.AddRange(listNonMatch);
    return returnList;
}

用法:List&lt;int&gt; lstOdd = lst.PrependAll(i =&gt; i == numberToBeMovedOnTop);

【讨论】:

    【解决方案2】:

    除了使用 linq,不使用 linq 可能同样有效/易于理解

    var listToAdd = new List<int>();
    var listOdd = new List<int>();
    for(int i = 0; i < lst.Count; i++)
    {
        if(lst[i] == numberToBeMovedOnTop)
        {
            listToAdd.Add(numberToBeMovedOnTop);
        }
        else
        {
            listOdd.Add(lst[i]);
        }
    
    }
    listOdd.AddRange(listToAdd);
    

    跟踪您已删除的内容,然后添加它们

    【讨论】:

      【解决方案3】:

      先按谓词分组,然后联合?

              var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
              var grp = nums.GroupBy(x => x % 2 == 0).ToList();
              var changed = grp[0].Union(grp[1]).ToList();
      

      【讨论】:

      • 你的谓词不同,但你明白了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      相关资源
      最近更新 更多