首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按类型订购具有特定计数的集合

按类型订购具有特定计数的集合
EN

Stack Overflow用户
提问于 2014-11-07 14:30:50
回答 4查看 62关注 0票数 0

不太清楚该如何解释,但下面是我的尝试:

在网页上,我需要在一个列表中显示引用、引用。首先,我需要显示4个参考资料(图像,标题,链接),然后一个引用(引用,作者),然后再次4个参考,1个引用等等。

我有两个不同来源的记录。一种称为引用,另一种称为引号。他们现在在一个拥有两个来源的大藏品中。

现在,我需要找到一种方法,将它们按照以下顺序进行排序:

  • 参考文献1
  • 参考文献2
  • 参考文献3
  • 参考文献4
  • 报价1
  • 参考文献5
  • 参考文献6
  • 参考文献7
  • 参考文献8
  • 报价2

合乎道理?

这是我特定的ReferenceItem类的代码,我用它来创建一个集合,其中包含两个数据源。

代码语言:javascript
运行
复制
public class ReferenceItem
{
    public ReferenceType ReferenceType { get; set; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public string ImageUrl { get; set; }
    public string PageUrl { get; set; }
    public string Referent { get; set; }
    public int Counter { get; set; }
}

有什么办法解决这个问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-07 15:07:17

对于这两种引用类型,您都可以使用Lookup,这与字典非常有效。然后使用for-loop和Enumerable.Skip/Take从每个序列创建包,并使用Enumerable.Concat将它们放在一起。最后将它们添加到新的List<ReferenceItem>

代码语言:javascript
运行
复制
var lookup = items.ToLookup(i => i.ReferenceType);
var sortedItems = new List<ReferenceItem>(items.Count);
for (int refIX = 0, quoteIX = 0; refIX < items.Count; refIX += 4, quoteIX++)
{
   var refPackage = lookup[ReferenceType.References].Skip(refIX).Take(4);
   var quotePackage = lookup[ReferenceType.Quotes].Skip(quoteIX).Take(1);
   sortedItems.AddRange(refPackage.Concat(quotePackage));
}

下面是我用来测试的示例:

代码语言:javascript
运行
复制
var items = new List<ReferenceItem>() { 
    new ReferenceItem{ ReferenceType = ReferenceType.Quotes, Counter = 1 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 2 },
    new ReferenceItem{ ReferenceType = ReferenceType.Quotes, Counter = 3 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 4 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 5 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 6 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 7 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 8 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 9 },
    new ReferenceItem{ ReferenceType = ReferenceType.References, Counter = 10 }
};
票数 1
EN

Stack Overflow用户

发布于 2014-11-07 14:46:52

下面是我如何做这件事的伪代码。在合并的同时,将它们按您想要的顺序排列。

代码语言:javascript
运行
复制
List<ReferenceItem> result = new List<ReferenceItem>();

while (References.Count >= 4 && Quotes.Count >= 1)
{
   // note pseudo code, how you do the add might be different.
   reference = References.Dequeue();
   result.Add(reference);
   reference = References.Dequeue();
   result.Add(reference);
   reference = References.Dequeue();
   result.Add(reference);
   reference = References.Dequeue();
   result.Add(reference);

   quote = Quotes.Dequeue();
   result.Add(quote);           
}

// handle edge cases where there are less than 4 items in Ref and 1 in Quote
// (this was not specified in the question)

注意,您可以使用Linq和Zip()或聚合()来完成一些技巧,但我不认为在本例中使用这些方法会有多大收获。上面的代码是清晰的,很容易维护。

票数 0
EN

Stack Overflow用户

发布于 2014-11-07 14:50:08

可以使用.Where()方法将列表拆分为引号和引用列表:

代码语言:javascript
运行
复制
var quotes = records.Where(r => r.ReferenceType == ReferenceType.Quote);
var references = records.Where(r => r.ReferenceType == ReferenceType.Reference);

然后,在循环中遍历项并依赖于索引,选择引用或引号并将其添加到结果列表中。你的情况可能是这样的:

代码语言:javascript
运行
复制
if (index % 5 == 0) {
    //pick one from quotes and put it into the result list
}
else {
    //pick one from references and put it into the result list
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26803493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档