Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何获取列表每个位置的最大字符数<;字符串>;在.NET中(没有循环)?_C#_Linq_Lambda - Fatal编程技术网

C# 如何获取列表每个位置的最大字符数<;字符串>;在.NET中(没有循环)?

C# 如何获取列表每个位置的最大字符数<;字符串>;在.NET中(没有循环)?,c#,linq,lambda,C#,Linq,Lambda,我有以下代码: var strings = new List<string>() { "012abc", "120ccc", "000aaa" }; var str = strings.Select(x => x.ToCharArray()); var strings=newlist(){“012abc”、“120ccc”、“000aaa”}; var str=strings.Select(x=>x.ToCharArray()); 我需要将每个位置上的最大字符串作为字符串返

我有以下代码:

var strings = new List<string>() { "012abc", "120ccc", "000aaa" };
var str = strings.Select(x => x.ToCharArray());
var strings=newlist(){“012abc”、“120ccc”、“000aaa”};
var str=strings.Select(x=>x.ToCharArray());
我需要将每个位置上的最大字符串作为字符串返回

  • 位置1:0、1和0=1
  • 位置2:1、2和0=2
结果字符串应为:122ccc


是否有一个Lambda/Linq查询可以用于此操作,还是只需要循环遍历每个字符?

我假设所有字符串的长度都相等

解决方案1:不使用Linq

其思想是:在循环中的
i
位置获取
max
char

var strings = new List<string>() { "012abc", "120ccc", "000aaa" };
var arrays = strings.Select(x => x.ToCharArray());

var charResult = new List<char>();

for(int i = 0; i < strings.First().Length;i++)
{
    charResult.Add(arrays.Select(x=> x[i]).Max());
}           
解决方案2:使用Linq

小提琴的工作原理是:

其思想是:使用
Aggregate
来比较每对字符[]

var strings = new List<string>() { "012abc", "120ccc", "000aaa" };
var arrays = strings.Select(x => x.ToCharArray());          

var charResult = arrays.Aggregate((a, b) => b.Select((t,i) => (char)Math.Max(t, a[i])).ToArray());          

Console.Write(new string(charResult.ToArray()));

你能和一个循环逻辑分享你的尝试吗?另外,我认为你应该增加更多的例子。你能详细说明你的“位置”逻辑吗?是什么让它成为“最大字符”?ascii数字?十六进制值?所有字符串的长度都相等吗?所有字符串的长度都相同。每个位置上的类型始终相同。如果第一个字符串中的位置1是数字,那么其余的也将是字符串。类型可以是数字[0-9]或小写字母[a-z]。我只需要使用一个普通的循环就可以了。“无循环”聚合的很好的使用:)注意,您可以用
string.Concat(charResult)
替换
新字符串(charResult.ToArray())
,作为我答案中的一个实验,新字符串是最快的方法。因此,我喜欢使用它,您不需要
arrays=strings.Select(x=>x.tocharray())-您可以在使用
数组的位置使用
字符串
。这将节省一些周期。也可以使用
strings.First().Length
而不是
strings[0]。Length
作为我的答案stackoverflow.com/a/51584267/6230863中的一个实验,new string是我查看测试代码的最快方法,但我注意到,它没有考虑到使用
.ToArray()
创建额外数组对GC造成的额外压力,因此结果有点可疑。
var strings = new List<string>() { "012abc", "120ccc", "000aaa" };
var arrays = strings.Select(x => x.ToCharArray());          

var charResult = arrays.Aggregate((a, b) => b.Select((t,i) => (char)Math.Max(t, a[i])).ToArray());          

Console.Write(new string(charResult.ToArray()));
122ccc