Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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# 我希望获得长度相同的字符串的第一个和第二个字母对(使用LINQ)_C#_String_List_Linq - Fatal编程技术网

C# 我希望获得长度相同的字符串的第一个和第二个字母对(使用LINQ)

C# 我希望获得长度相同的字符串的第一个和第二个字母对(使用LINQ),c#,string,list,linq,C#,String,List,Linq,我有两个字符串列表 List A=新列表{“1QWERTY”、“ASDF4B2J”、“C0QW”、“8D”}; 列表B=新列表{“GJ65SJ2”、“KO21L94B”、“ABF287KF2”、“GPK25”}; 我想得到一对长度相同的字符串的第一个字母和第二个字母(通过使用LINQ) 像1Q:GJ或AS:KO 所以,我写了这段代码: var res=A.连接( B a=>a.长度, b=>b.长度, (a,b)=>new{str=a[0]+a[1]+”:“+b[0]+b[1]} ); for

我有两个字符串列表

List A=新列表{“1QWERTY”、“ASDF4B2J”、“C0QW”、“8D”};
列表B=新列表{“GJ65SJ2”、“KO21L94B”、“ABF287KF2”、“GPK25”};
我想得到一对长度相同的字符串的第一个字母和第二个字母(通过使用LINQ)

1Q:GJ
AS:KO

所以,我写了这段代码:

var res=A.连接(
B
a=>a.长度,
b=>b.长度,
(a,b)=>new{str=a[0]+a[1]+”:“+b[0]+b[1]}
);
foreach(在res中的变量e)
{
控制台写入线(e.str);
}
但是我没有使用
a[0]
a[1]
来代替
1Q
AS
,而是得到了一些数字。
因此,该请求的结果是:

130:GJ
148:KO
但是当我只使用
a[0]
a[1]
时:

var res=A.Join(B,A=>A.Length,B=>B.Length,(A,B)=>new{str=A[0]+”:“+B[0]+B[1]});
我得到了一个正确的符号,比如:

1:GJ
A:高

那么,为什么它会这样工作?我应该如何更改代码以使其正常工作?

这与linq无关

a[0]
字符
,而不是
字符串
。可能令人困惑的是,没有为
char
定义加法运算符:您不能将两个
char
添加到一起以获得
字符串

但是,
char
可以隐式转换为整数类型,并且有一个用于
ints
的加法运算符。因此,如果执行
'A'+'B'
,则会转换为
65+66
,即整数
131

然后我们尝试将其添加到
字符串中。在anything和
string
之间定义了一个加法运算符,它通过对非字符串的对象调用
ToString()
,然后将其与字符串连接起来来工作。因此
131+”:“
131.ToString()+”:“
,即字符串
”131:“

当我们添加
b[0]
b[1]
时,我们通过添加first doing
“131:+b[0]
来实现这一点。这与上面关于字符串添加的规则相同,因此转换为
“131:+b[0].ToString()
,例如
“131:”+“C”。ToString()
,即“131:C”。然后我们在添加
b[1]
时也会这样做

有几种方法可以满足您的需要:您可以执行
a[0]。ToString()+a[1]+“:“+…
强制将第一个
char
转换为
字符串。或者您可以执行
“”+a[0]+…
来实现相同的目标。不过,最简单的方法是根本不使用字符串连接,而是使用
$“{a[0]}{a[1]}:{b[0]}{b[1]}”

另一种方法是不选择单个字符,而是将前两个字符作为字符串拉出,而不是
a.Substring(0,2)
。然后您可以编写
a.Substring(0,2)+:“+b.Substring(0,2)
,或者$”{a.Substring(0,2)}:{b.Substring(0,2)}`


请注意,如果您有任何长度为0或1个字符的字符串,这一切都不安全

只需将方法中的结果选择器
Func
更新为

(a,b)=>新的{str=$“{a.Substring(0,2)}:{b.Substring(0,2)}”
这将从
a
b
字符串中获取前两个字母,并使用将它们连接成一个字符串。输出将如下所示

1Q:GJ
AS:KO

在您的解决方案中,不要使用字符串索引,而是使用字符串子字符串,如下所示

var res = A.Join(B,
              a => a.Length,
              b => b.Length,
              (a, b) => new { str = a.Substring(0,2) + ":" + b.Substring(0,2) });

因为您刚才添加了
:“
。因此,您正在将
b[0]
b[1]
添加到字符串中,而不是添加到另一个字符中。谢谢,我在[0]之前添加了“”,现在它可以工作了,但是我应该如何更改代码以使其更通用,而不添加“”?@Roomey使用插值或
string.Format
。我会使用
string.Format
来处理这种事情,也可以使用,它有一个接受单个字符的Append方法重载。