2010-11-02 72 views
0

問題的快速說明:我有一個特定順序的項目列表,我將它們分成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]); 
} 

僅供參考,這可能聽起來像但不是面試問題,這是一個現實世界的問題。

+0

什麼是你的商業規則''但那些項目是最接近右列表.'?在奇數進入A甚至進入B的例子中,什麼是「最接近的」? – JumpingJezza 2010-11-02 06:09:12

+0

從左到右,即如果我有,左側列表中的1,2,3位,以及右側列表中的4,5,6 ...我需要打印5個項目......他們將是2,3, 4,5,6 ...有幫助嗎? – user494352 2010-11-02 06:23:58

+0

是的 - 高科技公司的解決方案,雖然我不得不擺弄語法來讓它工作:) – JumpingJezza 2010-11-02 06:45:53

回答

0

我對你想要做的事情不知所措......但是,我會用你的機率甚至是榜樣來刺殺它。我將把我的例子寫成一個標準的C#控制檯應用程序。

我不知道如何使用LINQ來分割一個枚舉。因此,我的示例將使用兩個單獨的lambda表達式將IEnumerable分爲不同的組。然後,我將指定數量的項目從A分配給AB。在此之後,我將B中指定數字的剩餘部分(如果有的話)合併到AB中。最後一部分遍歷並將每個內容打印到一個CSV字符串中。

static void Main(string[] args) 
    { 
     int[] numArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

     OddsAndEvens(7, numArray); 
     OddsAndEvens(4, numArray); 
    } 

    public static void OddsAndEvens(int numToPrint, int[] array) 
    { 
     var a = array.Where(n => n % 2 == 0); // evens 
     var b = array.Where(n => !(n % 2 == 0)); // not evens, thus odds 
     var ab = a.Take(numToPrint); 
     ab = ab.Union(b.Take(numToPrint - ab.Count())); 

     foreach (int i in ab) 
     { 
      Console.Write(i + ", "); 
     } 
     Console.WriteLine(); 
     Console.WriteLine("Press any enter to continue..."); 
     Console.ReadKey(); 
    } 

注:一個更好的方法可能是將數組轉換爲字符串,然後用的string.join創建一個CSV,但我已經離開了這個部分,以避免更多的混亂。

1

很難跟蹤你的問題。你也許應該從listA和listB開始,並解釋你真正想從他們那裏得到什麼。我想你是要求:

var result = (listA.Reverse().Take(Y).Concat(listB.Reverse())).Take(Z).Reverse(); 
相關問題