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

时间:2014-11-07 14:30:50

标签: c# asp.net linq

不太清楚如何解释这个,但这是我的尝试:

在网页上,我需要在一个列表中显示引用引号。首先,我需要显示4个引用(图像,标题,链接),然后1引用(引用,作者),然后再显示4个引用,1引用等等。< / p>

我有来自两个不同来源的记录。一个叫做References,另一个叫做行情。 它们现在位于一个包含两个来源的大集合中。

现在我需要找到一种方法来实际按照这个顺序对它们进行排序:

  • 参考文献1
  • 参考2
  • 参考3
  • 参考4
  • 引用1
  • 参考文献5
  • 参考文献6
  • 参考7
  • 参考文献8
  • 引用2

有道理吗?

这是我特定的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; }
}

有关如何对此进行排序的任何想法?

4 个答案:

答案 0 :(得分:1)

你可以使用Lookup作为两种类似于字典的引用类型,因此非常有效。然后使用for - 循环和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 }
};

答案 1 :(得分:0)

这是我将如何做的伪代码。虽然合并将它们按照您想要的顺序排列。

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()或Aggregate()来做一些技巧,但我不相信你在这种情况下使用它们会获得很多。上面的代码很清楚,很容易维护。

答案 2 :(得分:0)

您可以使用.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
}

答案 3 :(得分:-3)

不确定为什么你决定将它们全部放在一个集合中......但是你可以使用列表MSDN的自定义排序我之前使用过它并且非常强大。