【问题标题】:How to select data in rows using LINQ?如何使用 LINQ 选择行中的数据?
【发布时间】:2014-03-11 13:46:03
【问题描述】:

如何使用LINQselect 所有行中的所有Company NameCompany ID?我需要类似这样的伪代码:

 var typedQry = from b in allData.AsEnumerable()
                where b.GetHeader("xxx") == "08/10/09 to 08/26/09"
                select CompanyName, CompanyID, ...

下面的代码只选择一个公司名称。相反,我想要所有行中的公司名称:

var typedQry3  = from b in allData.AsEnumerable()
select new { compname0 = b._rows[0][5]}; 

_rows 中的数据为Company Name (e.g., allData[0]._rows[0][5], allData[0]._rows[1][5],....)Company ID 等。

但是,Company NameCompany ID 等未在 DataProperty 类中定义。它们的值从数据文件插入到 _rows 中。

感谢任何帮助。下面是一些代码,可以帮助您理解我的问题。

List<DataProperty> allData = new List<DataProperty>();

DataProperty 类由

private readonly Dictionary<string, string> _headers = new Dictionary<string, string>(); 
private readonly List<string[]> _rows = new List<string[]>();

以及这些方法(除其他外):

public string[] GetDataRow(int rowNumber){return _rows[rowNumber];}
public void AddDataRow(string[] row){_rows.Add(row);}

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    根据您的评论,如果您需要每个公司的sum,您可以试试这个:

    var RowList1 = allData.SelectMany(u => u._rows.Select(t => new
            {
                CompanyName = t[5],
                Amount = Convert.ToInt64(t[1]) + Convert.ToInt64(t[2])
            }))
        .Where(u => u.CompanyName == "XXX")
        .OrderBy(u => u.CompanyName)
        .ToList();
    

    如果您需要汇总所有公司,您可以试试这个:

    var SumAmount = allData.SelectMany(u => u._rows.Select(t => new
            {
                 CompanyName = t[5],
                 Amount = Convert.ToInt64(t[1]) + Convert.ToInt64(t[2])
            }))
        .Where(u => u.CompanyName == "XXX")
        .DefaultIfEmpty()
        .Sum(u => u.Amount);
    

    您可以使用这些编写自己的自定义查询

    【讨论】:

    • 再次感谢!!!我检查了您的第一个答案是否已接受。由于系统不允许我接受第二个答案,因此我将您的第二个答案标记为有用,但实际上它不仅有用。
    【解决方案2】:

    您可以使用它来获取所有公司名称:

    var AllCompanyNames = allData.SelectMany(u => u._rows.Select(t => t[5])).ToList();
    

    还有这个,以获得更多的财产:

    var Rows = allData.SelectMany(u => 
            u._rows.Select(t => new
            {
                CompanyName = t[5],
                Other1 = t[1],
                Other2 = t[2]
            }))
        .ToList();
    

    还有这个,如果你需要检查任何条件:

    var FilteredRows = allData.SelectMany(u => 
            u._rows.Select(t => new
            {
                CompanyName = t[5],
                Other1 = t[1],
                Other2 = t[2]
            }))
        .Where(u => u.CompanyName == "XXX")
        .ToList();
    

    【讨论】:

    • 非常感谢!!!您提供的查询正是我所需要的。您能否再提供一个包含 CompanyName 的示例,并说明如何将 Credits 和 Debits 等两个字段相加并按 CompanyName 排序?
    • 您的答案已被检查。
    【解决方案3】:

    首先,您可以接收行,然后遍历它们。 这个例子可以帮助你

    var rows = (from DataRow dRow in dTable.Rows
                                select new {col1=dRow["dataColumn1"],col2=dRow["dataColumn2"]});
    
            foreach (var row in distinctRows) 
            {
                var value1=row.col1.ToString();
                var value2=row.col2.ToString();  
    
            }
    

    【讨论】:

    • 您是否建议我在使用上述查询之前需要将 allData (List allData = new List()) 转换为 Datable?数据来自数据文件,而不是数据库表。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多