我正在处理二进制向量,因此string
中的每个List<string>
看起来像
vectors[0] = "1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 1";
vectors[1] = "1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1";
我希望获得List<string>
中最大的字符串,其中大多数为1。
答案 0 :(得分:3)
我会这样做:
var biggest= vectors.Select(v=> new {Vector = v, Count = v.Count(c => c=='1')})
.Aggregate((seed, current) => seed.Count < current.Count ? current:seed)
.Vector;
您也可以使用OrderBy
扩展方法,但Aggregate
为O(n),而OrderBy
为O(n * log n)。
我首先拨打Select
分机,以避免多次计算seed
1的数量:
var biggest= vectors.Aggregate((seed, current)=>seed.Count(c=>c=='1')<current.Count(c=>c=='1')?current:seed);
答案 1 :(得分:3)
我觉得这里提供的解决方案太复杂了。 所以这是我的:
vectors.OrderByDescending(v => v.Count(c => c == '1')).First();
请注意,每个“Vector”仅计算一次Count。 EnumerableSorter为您做到这一点。
如果您想要更高效的解决方案,请转到@octavioccls answer
答案 2 :(得分:1)
您可以使用Count()
方法:
int index = 0;
int max = vectors[0].Count(x => x == '1');
for (int a = 1; a < vectors.Length; a++)
{
var count = vectors[a].Count(x => x == '$');
if (count > max)
{
max = count;
index = a;
}
}
循环后,您将拥有最大&#39; 1&#39;
的字符串索引答案 3 :(得分:1)
使用LINQ
var result = vectors.Select(d => new { Item = d,
OneCount = d.Split(' ').Count(y => y == "1")})
.OrderByDescending(t => t.OneCount)
.Select(k=>k.Item).FirstOrDefault();
答案 4 :(得分:1)
vectors.OrderByDescending(b => b.Split('1').Length).First()
答案 5 :(得分:0)
您可以在列表上执行循环,并为每个字符串计算&#39; 1&#39;的出现次数。这样:
int count = myString.Split('1').Length - 1;
然后存储一个临时变量,其中包含本地最大值和最大值的字符串数。 像这样:
int max = list[0].Split('1').Length - 1;
int stringMax = 0;
for (int i = 1; i < list.Length; i++)
{
var count = list[i].Split('1').Length - 1;
if (count > max)
{
max = count;
stringMax = i;
}
}
最后 stringMax 是具有最大值的字符串, max 是该值
答案 6 :(得分:0)
var vectors = new[] {
"1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 1",
"1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1",
};
var q = from v in vectors
select new
{
v,
c = v.Split(' ').Count(b => b == "1"),
};
var m = q.First(c => c.c == q.Max(b => b.c)).v;
答案 7 :(得分:0)
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
Console.WriteLine("Hello World");
var vectors = new List<string>();
vectors.Add("1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 1");
vectors.Add("1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1");
foreach(var v in vectors)
{
var result = new List<string>();
int max = 0;
foreach(var c in v)
{
if(string.IsNullOrEmpty(c.ToString().Trim())) continue;
//Console.Write(c);
//Console.Write(max);
if(c != '1')
{
max = 0;
}
else
{
max++;
if(max > result.Count)
{
result.Add(c.ToString());
}
}
}
Console.WriteLine("Final Result: " + string.Join(" ", result));
}
}
}