使用LINQ C#在字符串列表中查找字符频率最高的字符串#

时间:2016-04-28 16:02:58

标签: c# arrays linq list

我正在处理二进制向量,因此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。

8 个答案:

答案 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));
        }
    }
}
相关问题