Pyynnn_ 2023-08-03 09:40 采纳率: 0%
浏览 8

Linq语句对list集合中的某个值进行排序


 var tmp1 = db.GetList<T_RECORD>(o => o.VALID_FLAG == true && o.ASSEMBLY_CODE.Equals(selectedSn)).OrderBy(p => p.WS_ID).
            Select(f => new WsRepaired() { WS_ID = f.WS_ID, WORKPIECE_STATUS = f.WORKPIECE_STATUS.GetValueOrDefault(), ID = f.ID }).ToList();


            var tmp2 = db.GetList<T_RECORD_VISION>(o => o.VALID_FLAG == true && o.ASSEMBLY_CODE.Equals(selectedSn)).OrderBy(p => p.WS_ID).
            Select(f => new WsRepaired() { WS_ID = f.WS_ID, WORKPIECE_STATUS = f.WORKPIECE_STATUS.GetValueOrDefault(), ID = f.ID }).ToList();
            foreach (var item in tmp2)
            {
                tmp1.Add(item);

            }
            var test = tmp1.ToList();
            var tmp=test.OrderBy(o=>o.WS_ID).ToList();


我把两个集合合并,再对集合进行排序得到新的集合,可是排序之后在界面上展示的只是两个集合合并的结果,没有排序成功,这是为什么?

  • 写回答

4条回答 默认 最新

  • wanghui0380 2023-08-03 11:33
    关注

    请问大佬,WS_ID的值是OP10,OP23这种,OP后面是数字,我用Concat方法和OrderBy试了一下还是不行,请问OrderBy是不是不能用在此处排序?

    额,难怪。 因为字符串排序是按字符编码排序
    比如 “1”,“2“,”10“,”11“,”20”
    他排序是 "1","10","11","2","20"
    所以你需要根据你自己的规则编写 自定义排序比较方法
    你可以参考 IComparable接口实现(记不清了,大概是这个接口把)

    下面代码是ChartGpt给的,我没进行验证,只是大体上告诉你实现的方向

    您可以使用以下代码实现一个StringNumericComparer类来对字符混合数字的字符串进行排序:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    public class StringNumericComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            string[] xParts = SplitParts(x);
            string[] yParts = SplitParts(y);
    
            // Compare parts one by one
            for (int i = 0; i < Math.Min(xParts.Length, yParts.Length); i++)
            {
                int result;
                // If both parts are numeric, compare as integers
                if (int.TryParse(xParts[i], out int xNum) && int.TryParse(yParts[i], out int yNum))
                {
                    result = xNum.CompareTo(yNum);
                }
                // Otherwise, compare as strings
                else
                {
                    result = xParts[i].CompareTo(yParts[i]);
                }
    
                // If parts are not equal, return comparison result
                if (result != 0)
                {
                    return result;
                }
            }
    
            // If all parts are equal, compare by length
            return xParts.Length.CompareTo(yParts.Length);
        }
    
        private string[] SplitParts(string input)
        {
            return input.Split(new[] { " ", "-", "_" }, StringSplitOptions.RemoveEmptyEntries);
        }
    }
    

    然后,您可以在LINQ查询中使用此StringNumericComparer类进行排序,例如:

    List<string> strings = new List<string> { "abc2", "def1", "xyz10", "abc12", "abc3" };
    
    var sortedStrings = strings.OrderBy(s => s, new StringNumericComparer());
    
    foreach (var str in sortedStrings)
    {
        Console.WriteLine(str);
    }
    

    这将输出:

    abc2
    abc3
    abc12
    def1
    xyz10
    

    请注意,该实现假设数字部分不会超过int类型的范围。如果有可能出现较大的数字,请相应地调整类型。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月3日

悬赏问题

  • ¥30 comsol仿真等离激元
  • ¥15 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型
  • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)