Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建字母和数字的字符串组合系列?_C# - Fatal编程技术网

C# 如何创建字母和数字的字符串组合系列?

C# 如何创建字母和数字的字符串组合系列?,c#,C#,我有一个数据列表集合,例如: List<String> Dummy = new List<String>() { "1001A", "1003A", "1002B", "1002A", "1003B", "1001B", "1003C", "1002C", "1001C", }; 除了上面的例子之外,我已经有了一系列数字的函数代码。谢谢你阅读我的帖子 var result = Dummy .OrderBy

我有一个数据列表集合,例如:

List<String> Dummy = new List<String>()
{
  "1001A",
  "1003A",
  "1002B",
  "1002A",
  "1003B",
  "1001B",
  "1003C",
  "1002C",
  "1001C",
};
除了上面的例子之外,我已经有了一系列数字的函数代码。谢谢你阅读我的帖子

 var result = Dummy
              .OrderBy(p => p[p.Length - 1])
              .ThenBy(p => p.Substring(0, p.Length - 1));
这将首先按字符串的最后一个字符排序,然后按除字符串最后一个字符以外的所有字符排序

如果所有字符串的长度相同,您也可以将最后一部分保留在
。然后按(p=>p)
,因为字符串已按最后一个字符排序。如果字符串长度不同,则需要与我的代码中相同的子字符串。

版本a)(最快)

使用内置排序方法(就地排序),并使用自定义比较委托/lambda

 dummy.Sort((s1, s2) =>
 {
      // TODO: Handle null values, now supposing s1 and s2 are not null
      // TODO: Handle variable length if needed. Supposing fixed 4+1 data 
      var result = s1[4].CompareTo(s2[4]);
      if (result != 0)
      {
          return result;
      }
      return s1.Substring(0, 4).CompareTo(s2.Substring(0, 4));
  });
要重用比较,可以将其作为静态方法而不是内联lambda编写,但是在这种情况下,我建议改为实现IComparator。(排序方法具有接受IComparator的重载)

版本b):

使用LINQ:

// TODO: Handle variable length if needed, supposing fixed 4+1 data structure:
var orderedList = dummy.OrderBy(s => s[4]).ThenBy(s => s.SubString(0,4).ToList();

如果字符串可能具有不同的长度,则需要以下内容

var result = data.OrderBy(d => d[d.Length - 1])
                 .ThenBy(d => int.Parse(d.Substring(0, d.Length - 1])));
当然,您需要防止可能的解析异常与坏数据


这假设您希望“200A”位于“1000A”之前。这是一种基于分组的解决方案:

var res = Dummy.GroupBy(str => str.Last()).OrderBy(g => g.Key)
               .SelectMany(g => g.OrderBy(str => str.Substring(0, str.Length - 1)))
               .ToList();

如果所有字符串的长度都与OP示例中的长度相同,那么这种方法就可行,但是如果字符串长度不同,那么它会将“1001A”放在“200A”之前。@juharr True,我假设这是作者想要的。例如,文件名。如果是纯数字,他需要使用
int.Parse(p.Substring(0,p.Length-1))
这会导致
索引超出范围异常
,以防字符串长度不同。感谢您的帮助,先生,我看到这个函数只有1行代码,但对我来说,这需要很多行。顺便说一句,再次谢谢你,先生。
var res = Dummy.GroupBy(str => str.Last()).OrderBy(g => g.Key)
               .SelectMany(g => g.OrderBy(str => str.Substring(0, str.Length - 1)))
               .ToList();