有两种类型(有条件):
public class ItemNumber
{
public int Number { get; set; }
public string Common { get;set; }
public int Order { get; set; }
}
public class ItemString
{
public string Common { get;set; }
public int Order { get; set; }
}
有两个充满数据的集合:
// Они заполнены данными
var numbers = new List<ItemNumber>();
var letters = new List<ItemString>();
必要的(这里的步骤顺序可以是任意的):
- 将集合的元素插入
numbers到集合中letters; letters按属性排序Order;- 将集合拆分
letters为子集合,其中拆分的边界将是(注意!numbers)我们从中插入并具有值Numbers = 4(例如)的那些元素,而这些元素本身Numbers = 4不应该包含在结果集合中。
以前,我不需要按条件拆分集合(参见第 3 项),只需要第 1项和第 2 项。我是这样使用 LINQ 做到的:
private static IReadOnlyCollection<ItemString> MergeCollections(IReadOnlyCollection<ItemNumber> numbers, IReadOnlyCollection<ItemString> letters)
{
var result = new List<ItemString>(letters);
result.AddRange(numbers.Select(p => new ItemString
{
Common = p.Common,
Order = p.Order
}));
result = result.OrderBy(p => p.Order).ToList();
return result;
}
我坐在这里折磨这个任务,如何最好地完成它。有一个想法是通过两个变量的循环来做到这一点,但到目前为止这个想法是模糊的。你能建议这个问题的最佳解决方案吗?可以用 LINQ 做到这一点吗?如果没有,我想看看算法的详细描述。
此代码比问题中的代码更具可读性:
关于分区,我没有了解那里的含义以及如何拆分它。如果边界是 Numbers = 4,并且我们按 Order 排序,那么我们可以假设可能有一堆分隔边界......
例如情况:
指定拆分条件或如何填充这些项目的条件。
更新:
所以我们得到了:范围列表 0 - 第一次出现,第一次出现 - 第二次出现,第二次 - 第三次......倒数第二次 - 最后一次。
然后我们在循环中成对迭代这些索引......
如果范围 >= 1 然后创建一个新工作表,填写它:
并将其作为下一个元素放入结果表中。
在上面的代码中可能存在轻微的语法错误。我无权访问视觉 :) 您将自己添加其余的逻辑