如何按字母顺序缩短文本,为每个字符赋予值

How to short text alphabetical whit giving value for each character

我在想短字符串是否有字符值的好方法。比如 A = 0, B = 1...

我编写了一些代码,但我得到的最好答案是错误的答案,我想我知道问题出在哪里,但我不知道问题是什么。

所以这是代码:

void Start()
{
    i = Inventory.instance;
    List<Items> items = i.returnList("Food");
    Debug.Log(items.Count); List<Items> sItems = GetListSetList(items);

    foreach (Items item in sItems)
    {
        Debug.Log(item.name);
    }
}

列表项 = i.returnList ("Food"); <-- 这部分是我询问库存 return 所有 "Food" 标记项目的地方。代码在这里:

public List<Items> returnList(string tag)
{
    List<Items> classifiedItemSet = new List<Items>();
    foreach (Items i in items)
    {
        if (i.tag == tag)
        {
            classifiedItemSet.Add(i);
        }
    }
    return classifiedItemSet;
}

List sItems = GetListSetList (items); <-- 这是我真正尝试列出我从库存中得到的东西的部分。看起来像这样:

 private List<Items> GetListSetList(List<Items> itemS)
{
    foreach (Items item in itemS)
    {
        GetAlphabetaValue(item);
    }
    List<Items> shorted = new List<Items>();
    Items[] hold = new Items[itemS.Count];
    foreach (Items item in itemS)
    {
        for (int x = 0; x < hold.Length; x++)
        {
            if (hold[x] == null)
            {
                hold[x] = item;
                break;
            }
            else
            {
                bool PassIt = true;
                for (int c_value = 0; c_value < item.Alphabet_value.Length; c_value++)                    
                    if (item.Alphabet_value[c_value] > hold[x].Alphabet_value[c_value])                        
                        PassIt = false;                       

                if (PassIt)
                {
                    for (int h_pos = hold.Length - 1; h_pos > x; h_pos--)                       
                        if (hold[h_pos] != null)
                            hold[h_pos] = hold[h_pos - 1];                       

                    hold[x] = item;
                    break; // If i use this break i get error ("NullReferenceException")
                }
                else continue;                             
            }
        }
    }
    for (int x = 0; x < hold.Length; x++)        
        shorted.Add(hold[x]);        
    return shorted;
}

这个空白的开始我给每个项目名称字符串中的每个字符一些值。这是这一部分:GetAlphabetaValue(项目);哦,抱歉,将它命名为 AlphaBeta :) 好吧,我是如何得到这个值的:

 private void GetAlphabetaValue(Items x)
{
    x.Alphabet_value = new int[x.name.Length];
    for (int c = 0; c < x.Alphabet_value.Length; c++)
    {
        string character = x.name.Substring(c, 1);
        character.ToLower();
        switch (character)
        {
            case "a":
                x.Alphabet_value[c] = 0;
                break;
            case "b":
                x.Alphabet_value[c] = 1;
                break;
            case "c":
                x.Alphabet_value[c] = 2;
                break;
            case "d":
                x.Alphabet_value[c] = 3;
                break;
            case "e":
                x.Alphabet_value[c] = 4;
                break;
            case "f":
                x.Alphabet_value[c] = 5;
                break;
            //To the end
        }
    }
}

我希望你能理解我想说的 :D 谢谢你 :) 在我开始这样做之前,我尝试在互联网上找到一些信息,但我没有找到任何如何真正可以从数组中缩短多个字符串的信息。

这部分我想我错了,但现在我看不出哪里错了:

 for (int h_pos = hold.Length - 1; h_pos > x; h_pos--) 
      if (hold [h_pos] != null)
      {
        hold [h_pos] = hold [h_pos - 1];                        
        hold [x] = item;
      }        

首先,您真的认为 +20 是个好主意吗switch-case

字符已经编号,英文字母a-z对应Unicode97-122个字符。

这个函数:

void GetAlphabetaValue(Items x)
{
  x.Alphabet_value = new int[x.name.Length];
  for (int c = 0; c < x.Alphabet_value.Length; c++) 
  {
      string character = x.name.Substring (c, 1);
      character.ToLower ();
      switch (character) 
      {
      case "a":
         x.Alphabet_value [c] = 0;
         break;  
       ///Etc... //Etc..... And end.  
      }
   }
}    

变成这样:

void GetAlphabetaValue2(Items x)
{
    var CharIntList = List<int>; 
    foreach (char ch in x.Name)
        CharIntList.Alphabet_value.Add(ch - 97);
   x.Alphabet_value = CharIntList.ToArray();
}

简单多了。此外,您的代码很乱,难以理解且格式错误。可能你是 C# 的新手,所以你应该了解你应该如何编写代码,这不像我做得很好,但其他人应该能够理解你的代码。

那么关于你的问题,我认为你的意思是sort而不是short(完全不同的东西)。还有为什么 Items 是复数?是单数,那么应该是Item.

好吧,我不知道你的问题,但你可以将 GetListSetList() 函数替换为:

private List<Items> GetListSetList(List<Items> items)
{
    foreach (Items item in items)
    {
        GetAlphabetaValue(item);
        Array.Sort(item.Alphabet_value);
    }
    return items;
}

尝试这样的事情

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Items> items = Items.returnList("Food");
            var groups = items.GroupBy(x => x.name.Substring(0,1)).ToList();

        }
    }
    public class Items
    {
        public static List<Items> items = new List<Items>();
        public string name { get; set; }
        public string type { get; set; }


        public static List<Items> returnList(string type)
        {
            return items.Where(x => x.type == type).ToList();
        }

    }

}

使用此代码。

        string str = "Tamil";
        List<char> list = str.ToList ();
        list = list.OrderBy(x => x.ToString()).ToList();
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();