2010-03-04 67 views
2

我的代碼有這樣的事情:計算總的內容長度表達式

HttpFileCollection files 

而不是通過每個文件的循環,並增加了file.ContentLength得到所有內容的總長度例如中

 int totalLength = 0; 
     for (int i = 0; i < files.Count; i++) 
     { 
      totalLength += files[i].ContentLength; 
     } 

有沒有辦法讓我有這樣的事情,我可以用一個lambda表達式做..

int totalLength = files.[some sort of delegate here to do the addition]. 

在此先感謝。

編輯:HttpFileCollection有一個GetEnumeratorMethod,但它需要實現IEnumerable使用lambda表達式嗎?

回答

6

你可以使用LINQ:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength); 

不幸的是,HttpFileCollection的枚舉返回一個字符串枚舉。爲了獲得實際的對象(HttpPostedFile),您需要通過鍵訪問「字典」。這將枚舉器轉換爲HttpPostedFile實例的枚舉(通過Select),然後總和內容長度。

+0

嗨,只是爲了理解,爲什麼我不需要遍歷文件和轉換?是否有某種自動枚舉發生在集合上?儘管閱讀「C#深度」,但還沒有完全掌握這個:) – Remotec 2010-03-04 16:46:53

+0

HttpFileCollection實現IEnumerable,所以你可以枚舉它作爲「對象」。上面的LINQ語句執行內聯,然後處理你的總和。它在內部基本上與執行foreach相同,轉換爲HttpPostedFile,然後求和ContentLength(但更易於讀寫)。 – 2010-03-04 16:53:22

+0

mmm - 這應該不會發生,給你上面發佈的代碼...你確定「文件」是一個HttpFileCollection,而不是一個字符串的集合,不知何故? – 2010-03-04 16:57:19

1

你需要轉換,就像這樣:

int totalLength = files.Cast<HttpPostedFile>().Sum(f => f.ContentLength); 
+0

這實際上不起作用 - files.GetEnumerator返回一個IEnumerable,它是字符串值。 – 2010-03-04 17:31:32

+1

@Reed Copsey,你是對的。 'HttpFileCollection'是一個完全搞砸的集合。 – 2010-03-04 19:26:23

1

要添加到接受的答案,事實上,你可以使用這個:

int totalLength = files.AllKeys.Select(k => files[k]).Sum(f => f.ContentLength); 

爲什麼你沒有理由枚舉在您的代碼是因爲Sum擴展方法爲您做。如果通過反射運行它,你最終找到這段代碼:

public static int Sum(this IEnumerable<int> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 
    int num = 0; 
    foreach (int num2 in source) 
    { 
     num += num2; 
    } 
    return num; 
} 

正如你看到的,這不是真的rocketscience。它甚至與原始代碼幾乎相同!

注意:如果您想要查找此代碼,請打開System.Core,進入System.Linq命名空間並打開Enumerable類定義。你會在這裏找到這些方法(我認爲其他地方)。

+0

這實際上不起作用 - files.GetEnumerator返回一個IEnumerable,它是字符串值 – 2010-03-04 17:32:25

+0

啊,我看到你編輯了你的答案。我會相應地更新我的。謝謝 :) – 2010-03-04 19:21:09