定位列表中的项目是否在 C# 中出现多次

Locating items in List whether they occur more than once in C#

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

首先,让我解释一下我为什么做我做的事:)

我正在尝试将一个字符串加密成一个单行代码,该代码保存一个字母在该字符串中使用的次数及其位置。通过这种方法,我将能够解密代码并再次获取(复制)全文。假设 myString 是 "How are you today"。我会像这样加密它 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;

        }

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

    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());
    }

这是编码 class:

    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]