【问题标题】:Locating items in List whether they occur more than once in C#定位列表中的项目是否在 C# 中多次出现
【发布时间】:2015-03-30 20:16:39
【问题描述】:

除了问题:Get List<> element position in c# using LINQ

首先,让我解释一下我为什么要这样做:)

我正在尝试将一个字符串加密为一个单行代码,该代码包含一个字母在字符串中使用的次数以及它的位置。通过这种方法,我将能够解密代码并再次获取(再现)全文。假设 myString 是“你今天好吗”。我会像这样加密它 o3[1,9,13],""3[3,7,11],a2[4,15],y2[9,17],H1[0],w1[2],r1[5],e1 [6],u1[10],t1[12],d1[14],?[18]

我知道这看起来很奇怪,但请考虑处理更大的字符串,例如电子书。这可以处理一两行中的所有文本。

加密与安全无关,只是将大数据保存在较小的空间中。

在我的代码中,我可以将字符串转换为列表,计算一个字母被使用了多少次,但是当字母出现多次时,我无法定义它们的位置。

private void btnKoda_Click(object sender, EventArgs e)
    {
        var yazi = txtYazi.Text;
        List<char> liste = yazi.ToList();
        List<string> tut = new List<string>();

        foreach (char harf in liste)
        {
            for (int i = 0; i < liste.Count; i++)
            {
                char ekle = liste[i];
                tut.Add(ekle.ToString());
            }

            foreach (var karakter in tut)
            {
                txtKod.Text += karakter;
            }

            // holds statics
            var istatistik =
                from c in tut
                group c by c into g
                select new { g.Key, say = g.Count() };
            var enCok =
                from giris in istatistik
                orderby giris.say descending
                select giris;
            foreach (var giris in enCok)
            {
                txtHarfler.Text += string.Format("{0}: {1}\r\n", giris.Key, giris.say);
            }

            break;

        }

【问题讨论】:

  • 仍在试图弄清楚这将如何导致字符串占用更小的空间...
  • 嗯,它并没有像我想象的那样发展。没错,这需要更长的时间。

标签: c# arrays list encryption position


【解决方案1】:

不确定您的代码中发生了什么,但我会这样做:

    private void button1_Click(object sender, EventArgs e)
    {
        Dictionary<Char, Encoding> dct = new Dictionary<char, Encoding>();

        string data = "How are you today";
        for(int i = 0; i < data.Length; i++)
        {
            Char C = data[i];
            if (!dct.ContainsKey(C))
            {
                dct.Add(C, new Encoding(C));
            }
            dct[C].AddOccurence(i);
        }

        StringBuilder SB = new StringBuilder();
        foreach(Encoding enc in dct.Values)
        {
            if (SB.Length == 0)
            {
                SB.Append(enc.ToString());
            }
            else
            {
                SB.Append("," + enc.ToString());
            }
        }

        Console.WriteLine(SB.ToString());
    }

这是编码类:

    public class Encoding
    {

        private Char _C;
        private List<int> _Positions;

        private Encoding() {}

        public Encoding(Char C)
        {
            this._C = C;
            this._Positions = new List<int>();
        }

        public Char Character
        {
            get
            {
                return _C;
            }
        }

        public int Count
        {
            get
            {
                return _Positions.Count;
            }
        }

        public int[] Occurences
        {
            get
            {
                return _Positions.ToArray();
            }
        }

        public override string ToString()
        {
            string[] values = Array.ConvertAll(this.Occurences.ToArray(), x => x.ToString());
            return this.Character.ToString() + this.Count.ToString() + "[" + String.Join(",", values) + "]";
        }

        public void AddOccurence(int position)
        {
            this._Positions.Add(position);
        }

    }

原始字符串:

How are you today

输出:

H1[0],o3[1,9,13],w1[2], 3[3,7,11],a2[4,15],r1[5],e1[6],y2[8,16],u1[10],t1[12],d1[14]

【讨论】:

  • 哇,你的代码简直完美。我无法建造我梦寐以求的东西,但你给我的东西给了我很多启发。谢谢。
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2019-06-13
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多