不太清楚该如何解释,但下面是我的尝试:
在网页上,我需要在一个列表中显示引用、和引用。首先,我需要显示4个参考资料(图像,标题,链接),然后一个引用(引用,作者),然后再次4个参考,1个引用等等。
我有两个不同来源的记录。一种称为引用,另一种称为引号。他们现在在一个拥有两个来源的大藏品中。
现在,我需要找到一种方法,将它们按照以下顺序进行排序:
合乎道理?
这是我特定的ReferenceItem类的代码,我用它来创建一个集合,其中包含两个数据源。
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; }
}有什么办法解决这个问题吗?
发布于 2014-11-07 15:07:17
对于这两种引用类型,您都可以使用Lookup,这与字典非常有效。然后使用for-loop和Enumerable.Skip/Take从每个序列创建包,并使用Enumerable.Concat将它们放在一起。最后将它们添加到新的List<ReferenceItem>中
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));
}下面是我用来测试的示例:
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 }
};发布于 2014-11-07 14:46:52
下面是我如何做这件事的伪代码。在合并的同时,将它们按您想要的顺序排列。
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()或聚合()来完成一些技巧,但我不认为在本例中使用这些方法会有多大收获。上面的代码是清晰的,很容易维护。
发布于 2014-11-07 14:50:08
可以使用.Where()方法将列表拆分为引号和引用列表:
var quotes = records.Where(r => r.ReferenceType == ReferenceType.Quote);
var references = records.Where(r => r.ReferenceType == ReferenceType.Reference);然后,在循环中遍历项并依赖于索引,选择引用或引号并将其添加到结果列表中。你的情况可能是这样的:
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
}https://stackoverflow.com/questions/26803493
复制相似问题