我的OM有一个"产品"对象.
每个产品都有一个'制造商ID'(属性,整数).
当我有一个要显示的产品列表时,前三个显示为"特色产品".
该列表已按特定排序顺序排序,将"特色"产品放在列表中的第一位.
但是,我现在需要确保列表中的特色产品来自不同的制造商.我想有一个方法来调用这个重新排序.尝试利用LINQ来查询输入'产品'和'结果'
public List<Product> SetFeatures(List<Product> products, int numberOfFeatures)
{
List<Product> result;
// ensure the 2nd product is different manufacturer than the first ....
// ensure the 3rd product is a different manufacturer than the first two...
// ... etc ... for the numberOfFeatures
return result;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
澄清:
原始列表按特定顺序排列:"最畅销",最高排名(降序排列).结果列表应保持此顺序,但调整或移动"向上"项目除外,以便不同的制造商可以看到前n个功能.
如果项目的前n个(numberOfFeatures)都有不同的制造商,那么列表根本不需要改变.
例如,如果numberOfFeatures = 3
产品1 - 制造商A(第一个特征)
产品2 - 制造商B(第二个特征)
产品3 - 制造商C(第三个特征)
产品4 - 制造商A(......未检查...)
产品5 -制造商A(......未经检查......)
例如,案例调整...例如...输入列表
产品1 - 制造商A
产品2 - 制造商A
产品3 - 制造商B
产品4 - 制造商A
产品5 - 制造商F
(......我们希望...)
产品1 - 制造商A(第一特征)
产品3 - 制造商B(第二特征......向上移动)
产品5 - 制造商F(第三特征......向上移动)
产品2 - 制造商A(......按下列表...)
产品4 - 制造商A(...推下列表......)
我认为 Bryan 很好地封装了排序逻辑,这不是我想做的事情。无论如何,我想用 Foo 的例子来表达我的看法。
List<Foo> foos = new List<Foo>()
{
new Foo() { Baz = 1, Blah = "A"},
new Foo() { Baz = 2, Blah = "A"},
new Foo() { Baz = 3, Blah = "B"},
new Foo() { Baz = 4, Blah = "B"},
new Foo() { Baz = 5, Blah = "B"},
new Foo() { Baz = 6, Blah = "C"},
new Foo() { Baz = 7, Blah = "C"},
new Foo() { Baz = 8, Blah = "D"},
new Foo() { Baz = 9, Blah = "A"},
new Foo() { Baz = 10, Blah = "B"},
};
var query = foos.Distinct(new FooComparer()).Take(3).ToList();
var theRest = foos.Except(query);
query.AddRange(theRest);
Run Code Online (Sandbox Code Playgroud)
FooComparer 是
public class FooComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
return x.Blah == y.Blah;
}
public int GetHashCode(Foo obj)
{
return obj.Blah.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
您将 (Baz) 1、3 和 6 移至顶部,之后其余的按其原始顺序排列。