繁体   English   中英

c# linq list 具有不同的 where 条件

[英]c# linq list with varying where conditions

private void getOrders()
{
    try
    {
        //headerFileReader is assigned with a CSV file (not shown here).
        while (!headerFileReader.EndOfStream)
        {
           headerRow = headerFileReader.ReadLine();
           getOrderItems(headerRow.Substring(0,8))
        }
    }
}

private void getOrderItems(string ordNum)
{
    // lines is an array assigned with a CSV file...not shown here.
    var sorted = lines.Skip(1).Select(line => 
        new 
        {
            SortKey = (line.Split(delimiter)[1]),
            Line = line
        })
        .OrderBy(x => x.SortKey)
        .Where(x => x.SortKey == ordNum);

    //Note ordNum is different every time when it is passed.
    foreach (var orderItems in sorted) {
        //Process each line here.
    }
}

以上是我的代码。 我正在做的是对于 headerFile 中的每个订单号,我处理 detailLines。 我只想搜索特定于订单 nr 的那些行。 上述逻辑工作正常,但它读取每个订单号的 where 子句,这根本不是必需的,并且会延迟过程。

我基本上想要 getOrderItems 类似下面的东西,但我无法获得,因为无法通过排序,但我认为这应该是可能的??

private void getOrderItems(string ordNum)
{
    // I would like to have sorted uploaded with data elsewhere and I pass it this function and reference it by other means but I am not able to get it.

    var newSorted = sorted.Where(x => x.SortKey == docNum);
    foreach (var orderItems in newSorted) {
        //Process each line here.
    }
}

请建议。

更新:感谢您的回复和改进,但我的主要问题是我不想每次都创建列表(就像我在代码中显示的那样)。 我想要的是第一次创建列表,然后只在列表中搜索特定值(此处为 docNum,如图所示)。 请建议。

以下内容将助您一臂之力,而且效率更高。

var sorted = lines.Skip(1)
    .Where(line => (line.Split(delimiter)[1] == ordNum))
    .Select(
        line => 
            new 
            {
                SortKey = (line.Split(delimiter)[1]),
                Line = line
            }
    )
    .OrderBy(x => x.SortKey);

预处理您的输入行并构建一个字典可能是一个好主意,其中每个不同的排序键都映射到一个行列表。 构建字典是O(n) ,之后你得到恒定时间O(1)查找:

// these are your unprocessed file lines
private string[] lines;

// this dictionary will map each `string` key to a `List<string>`
private Dictionary<string, List<string>> groupedLines;

// this is the method where you are loading your files (you didn't include it)
void PreprocessInputData()
{
     // you already have this part somewhere
     lines = LoadLinesFromCsv(); 

     // after loading, group the lines by `line.Split(delimiter)[1]`
     groupedLines = lines
        .Skip(1)
        .GroupBy(line => line.Split(delimiter)[1])
        .ToDictionary(x => x.Key, x => x.ToList());
}

private void ProcessOrders()
{
    while (!headerFileReader.EndOfStream)
    {
        var headerRow = headerFileReader.ReadLine();
        List<string> itemsToProcess = null;
        if (groupedLines.TryGetValue(headerRow, out itemsToProcess))
        {
            // if you are here, then
            // itemsToProcess contains all lines where
            // (line.Split(delimiter)[1]) == headerRow
        }
        else
        {
             // no such key in the dictionary
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM