問題的快速說明:我有一個特定順序的項目列表,我將它們分成2個列表,左和右。現在,假設我想要打印10個元素,並且需要注意的是,我想從右側列表中儘可能多地打印(即,如果此列表包含10個元素,那麼這個列表中的所有元素都很棒),但是如果我缺乏,我想從左邊的列表打印,但是那些最接近右邊列表的項目。將一個序列分組爲兩組,然後使用LINQ基於第二組中的元素的數量從第一組打印第一組使用LINQ
我有一個想法是這個......不知道我們是否可以寫出更短,更清晰的代碼。
var totalToPrint = 10
var listA,listB = originalList group by where some condition that is bool and hence two lists
var interimRightList = listB.Take(totalToPrint);
var myfinallist = listA.Skip(listA.length - interimRightList.Count()) + interimRightList;
這的確是所有我的大腦能想出,如果你知道這樣做,請讓我知道一個更簡單的方法。我還是要aactually寫這個真正的C#代碼...我正在做這聽起來似乎很簡單(也許是),但不知道啊,
這裏的形式化描述:
給定一個枚舉,例如:{1,2,3,4,5,6,7,8,9,10,11,12}
我想將它們分成兩組,A和B ......將提供一個功能決定他們屬於哪一組。爲了簡單起見,讓我們假設它將放入奇數集和偶數集,給定上述順序。現在,我想從集合B中輸出儘可能多的項目(比如X個項目),然後從集合A中輸出儘可能多的項目(比如說Y個項目),這樣X + Y = Z並沒有更多。換句話說,如果Z是10,X是10,那麼我們就不會從列表A中選取任何東西。同樣,如果Z是5,並且X是10,那麼我們從B中選出5個元素,而從A中選取一個。此外,這應該是穩定的,即排序不應該改變。
更完整的示例
{1,2,3,4,5,6,7,8,9,10,11,12} - 讓我們假設我們的組分割功能的任何元件,其是少於11,進入A,否則進入B.並且假設我們必須打印3個元素。因此,我們將從B中選擇{11,12},然後從A中選擇{10}並按順序打印...以便打印10,11,12。
下面是在正常代碼中的外觀:
int remaining = 10;
int a = 0;
for (int i = 0; i < listB.Count() && remaining > -1; ++i, ++a, remaining--)
{
// don't print(listB[i]); i.e do nothing
}
if (remaining > 0)
{
for (int i = listA.length - remaining; i < listA.length; ++i)
{
print(listA[i]);
}
}
for (int i = 0; i < a; ++i)
{
print(listB[i]);
}
僅供參考,這可能聽起來像但不是面試問題,這是一個現實世界的問題。
什麼是你的商業規則''但那些項目是最接近右列表.'?在奇數進入A甚至進入B的例子中,什麼是「最接近的」? – JumpingJezza 2010-11-02 06:09:12
從左到右,即如果我有,左側列表中的1,2,3位,以及右側列表中的4,5,6 ...我需要打印5個項目......他們將是2,3, 4,5,6 ...有幫助嗎? – user494352 2010-11-02 06:23:58
是的 - 高科技公司的解決方案,雖然我不得不擺弄語法來讓它工作:) – JumpingJezza 2010-11-02 06:45:53