gpt4 book ai didi

C# 元组/列表/泛型 - 有更短的方法吗?

转载 作者:行者123 更新时间:2023-11-30 19:10:52 25 4
gpt4 key购买 nike

我编写了一个程序或算法来解析命令行参数。首先,需要指定有效参数及其属性(标志、分隔符等)。

现在,我有一个返回的辅助函数:Tuple<Tuple<Argument, String>, String> :元组中的第一个元素(也是一个元组)包含一个“键值对”,null如果找不到对。第二个元素包含一个被标识为选项的字符串,分隔符为 " " (意味着该值将是命令行中的下一个元素)

该函数的代码如下:

private Tuple<Tuple<Argument, String>, Argument> f(string e, List<Argument> valid) {
var p = valid.Find( x => { return e.StartsWith( x.value ); } );
if ( p == null )
return new Tuple<Tuple<Argument, String>, Argument>( null, null );
if ( p.flag )
return new Tuple<Tuple<Argument, String>, Argument>( new Tuple<Argument, String>( p, "" ), null );
if ( p.separator.Equals(" ") && p.value.Length == e.Length )
return new Tuple<Tuple<Argument, String>, Argument>( null, p );
var si = e.IndexOf(p.separator);
if ( si != p.value.Length )
return new Tuple<Tuple<Argument, String>, Argument>( null, null );
return new Tuple<Tuple<Argument, String>, Argument>( new Tuple<Argument, String>( p, e.Substring( si + p.separator.Length ) ), null );
}

有没有办法把这个写得更短一些?我必须明确地将泛型放在那里吗?

显然,为此创建自己的类是一种解决方案。但不是还有另一个吗?

作为引用,Scala 中的相同代码如下所示:

val po = valid.find(p => e.startsWith(p.value))
po match {
case Some(p) =>
if ( p.flag )
(Some((p, "")), None)
else if ( p.separator.matches(" |\t") && p.value.length == e.length )
(None, Some(p))
else {
val si = e.indexOf(p.separator)
if ( si != p.value.length )
(None, None)
else
(Some((p, e.substring(si + p.separator.length))), None)
}
case _ => (None, None)
}

另外,有没有办法启动ListsTuples以紧凑的方式?如 List(1, 2, 3, 4)(Key, Value)而不是 Tuple<KeyType, ValueType>(Key, Value)

问候,
丹尼尔。

最佳答案

您可以使用 typedef 来清理代码。从技术上讲,C# 没有 typedef,但您可以使用 usings 来模拟它们。像这样:

using MyTuple = Tuple<Tuple<Argument, string>, Argument>;
using MyTuple2 = Tuple<Argument, string>;

public class MyClass {

private MyTuple f(string e, List<Argument> valid) {
var p = valid.Find( x => { return e.StartsWith( x.value ); } );
if ( p == null )
return new MyTuple( null, null );
if ( p.flag )
return new MyTuple( new MyTuple2( p, "" ), null );
if ( p.separator.Equals(" ") && p.value.Length == e.Length )
return new MyTuple( null, p );
var si = e.IndexOf(p.separator);
if ( si != p.value.Length )
return MyTuple( null, null );
return new MyTuple( new MyTuple2( p,
e.Substring( si + p.separator.Length ) ), null );
}
}

关于你关于初始化的问题,我不确定我是否理解。元组已经有一个紧凑的初始化方法,使用构造函数参数。

列表可以使用初始化器,像这样:

var s = new List<string> { "one", "two", "three" };

关于C# 元组/列表/泛型 - 有更短的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697645/

25 4 0
文章推荐: c# - 如何在一行中将 list 或 list 转换为 ListView.ListViewItemCollection