2014-09-19 22 views
0

大家好,感謝提前選擇,插入行號使用LINQ用的string.join

我有一個關於如何(或者)應做以下問題。我有一個正在返回的項目列表,並且我正在使用一個string.join將這些部分編譯成頁面上的單個字符串,但現在我需要將行號添加到此顯示中。

目前這個數據是如何顯示我怎麼想它看起來被添加後的數字:

Title (before)    Title (after) 
    ---------     --------- 
    Book1      1. Book1 
    Book2      2. Book2 

的數據被顯示在列表視圖在一個eval語句對每個項目(標題,程序),像這樣:

<asp:ListView runat="server" ID="lvResults" AutoGenerateColumns="False" ItemPlaceholderID="resultsPlaceHolder"> 
     <EmptyDataTemplate> 
      <div style="width: 100%; text-align: center;">No results available.</div> 
     </EmptyDataTemplate> 
     <LayoutTemplate> 
      <table id="tblResults" summary=""> 
       <tbody> 
        <asp:PlaceHolder runat="server" ID="resultsPlaceHolder"></asp:PlaceHolder> 
       </tbody> 
      </table> 
     </LayoutTemplate> 
     <ItemTemplate> 
      <tr> 
       <td> 
        Text: <%# Eval("Text") %><br/> 
        Description: <%# Eval("Description") %><br/> 
        <br class="clear"/> 
       </td> 
       <td> 
        Title<br/><%# Eval("Title") %> 
       </td> 
       <td> 
        Program<br/><%# Eval("Value") %> 
       </td> 
      </tr> 
     </ItemTemplate> 
    </asp:ListView> 

我填充列表視圖與此:

List<MyBooks> newBooklist = oldBookList.Select(i => new MyBooks() 
    { 
     Id = i, 
     Text = oldBookList.Where(o => o.Id == i).Select(o => o.Text).FirstOrDefault(), 
     Description = oldBookList.Where(o => o.Id == i).Select(o => o.Description).FirstOrDefault(), 
     //tried getting index here but output is wrong "{ index = 0, title = .. }" 
     Title = string.Join("<br/>", oldBookList.Where(o => o.Id == i).Select((o,index) => new { index, o.Title }).Distinct()), 
     Value = string.Join("<br/>", oldBookList.Where(o => o.Id == i).Select(o => o.Value).Distinct()), 
    }).ToList(); 

我想解決上述問題,以便我可以將數字作爲string.join操作的一部分添加到文本中。爲此,我在這裏嘗試了以下建議How To Project a Line Number Into Linq Query Result和這裏How to get index using LINQ? [duplicate],但這兩個示例似乎都有一個單獨的屬性來轉儲我在場景中沒有的值。

我發現的另一個想法是考慮循環瀏覽列表標題並添加文本,然後再將此列表填充到列表視圖中,但我擔心這會是一個昂貴的操作,會不會是?

我最不願意做的一件事就是將這些數字添加到SQL查詢中,因爲此查詢在其他地方使用。

[更新]

如要求在下面的評論,我想有數字,但我需要的數字,供節目標題和另一組中。實現這一目標的最佳方式最終證明只是用foreach語句來設置數字,然後再遍歷列表。

int dt = 0; 
    int oldId = 0; 
    foreach (var d in oldList) 
    { 
     if (oldId != d.Id) 
     { 
      dt = 0; 
      oldId = d.Id; 
     } 
     dt++; 
     d.Title = dt + ". " + d.Title; 
     d.Program = dt + ". " + d.Program; 
    } 

回答

1

使用enumerable.Range應該得到你想要的東西。

List<MyBooks> newBooklist = from i in Enumerable.Range(0, oldBookList.Count) 
{ 
    Id = i, 
    Text = oldBookList[i].Text, 
    Description = oldBookList[i].Description, 
    .... 

}).ToList(); 

您在OP中使用select重載,所以我認爲您知道它。但是,在這種格式就應該是這樣的:

List<MyBooks> newBooklist = oldBookList.Select((book, i) => new MyBooks() 
{ 
    Id = i, 
    Text = book.Text, 
    Description = book.Description, 
    .... 

}).ToList(); 
+0

這兩個答案讓我更接近我的目標,現在我能夠得到我想要他們的數字,但現在我有一個問題,我有兩個單獨的列表,標題以及程序及其編號爲例1-22,當我需要的是標題編號爲1-9,程序編號爲1-13時。這種方式可以使用索引嗎? – 2014-09-20 12:16:58

+0

@ElaineK不,不是由你在這裏給出的信息。這聽起來像是第二個問題。您應該投票並在此標記答案,並將其作爲新問題發佈。無論如何,它會得到更多的關注。 – paqogomez 2014-09-21 15:33:33

0

我想喬恩斯基特可能有答案給你Can I have an incrementing count variable in LINQ?

基本上沒有提供索引的Select過載,並且可以使用該索引在你的string.Join調用。

stuff.Select((value, index) => new { index, value.Name }); 
+0

這兩個答案讓我更接近我的目標,現在我能夠獲得我想要的數字,但現在我遇到了一個問題,我有兩個單獨的列表,標題和程序及其數字作爲例子1-22,當我需要的是標題編號爲1-9,程序編號爲1-13時。這種方式可以使用索引嗎? – 2014-09-20 13:56:38