如何按字母顺序缩短文本,为每个字符赋予值
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
对应Unicode
97-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();
我在想短字符串是否有字符值的好方法。比如 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
对应Unicode
97-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();