LINQ: Add RowNumber Column

前端 未结 9 1073
广开言路
广开言路 2020-11-29 07:26

How can the query below be modified to include a column for row number (ie: one-based index of results)?

var myResult = from currRow in someTable
                    


        
相关标签:
9条回答
  • 2020-11-29 08:04

    Use this Select method:

    Projects each element of a sequence into a new form by incorporating the element's index.

    Example:

    var myResult = someTable.Where(currRow => currRow.someCategory == someCategoryValue)
                            .OrderByDescending(currRow => currRow.createdDate)
                            .Select((currRow, index) => new {Row = currRow, Index = index + 1});
    

    In response to your edit:

    If you want a DataTable as result, you can go the non-Linq way by simply using a DataView and add a additional column afterwards.

    someTable.DefaultView.RowFilter = String.Format("someCategory = '{0}'", someCategoryValue);
    someTable.DefaultView.Sort = "createdDate";
    var resultTable = someTable.DefaultView.ToTable();
    resultTable.Columns.Add("Number", typeof(int));
    int i = 0;
    foreach (DataRow row in resultTable.Rows)
        row["Number"] = ++i;
    
    0 讨论(0)
  • 2020-11-29 08:05

    Use the method-syntax where Enumerable.Select has an overload with the index:

    var myResult = someTable.Select((r, i) => new { Row = r, Index = i })
        .Where(x => x.Row.someCategory == someCategoryValue)
        .OrderByDescending(x => x.Row.createdDate);
    

    Note that this approach presumes that you want the original index of the row in the table and not in the filtered result since i select the index before i filter with Where.

    EDIT: I'm looking for the results to be {idx, col1, col2...col-n} not {idx, row}. The row number should correspond to result rows not the table rows.

    Then select the anonymous type with all columns you need:

    var myResult = someTable.Where(r => r.someCategory == someCategoryValue)
            .OrderByDescending(r => r.createdDate)
            .Select((r, i) => new { idx = i, col1 = r.col1, col2 = r.col2, ...col-n = r.ColN });
    
    0 讨论(0)
  • 2020-11-29 08:08

    This one helped me in my case - Excel sheet extraction. anonymous type

    var UploadItemList = ItemMaster.Worksheet().AsEnumerable().Select((x, index) => new
    {
        Code = x["Code"].Value == null ? "" : x["Code"].Value.ToString().Trim(),
        Description = x["Description"].Value == null ? "" : x["Description"].Value.ToString().Trim(),
        Unit = x["Unit"].Value == null ? "" : x["Unit"].Value.ToString().Trim(),
        Quantity = x["Quantity"].Value == null ? "" : x["Quantity"].Value.ToString().Trim(),
        Rate = x["Rate"].Value == null ? "" : x["Rate"].Value.ToString().Trim(),
        Amount = x["Amount"].Value == null ? "" : x["Amount"].Value.ToString().Trim(),
        RowNumber = index+1
    }).ToList();
    
    0 讨论(0)
提交回复
热议问题