我有一个逗号分隔的字符串列表,如下所示:
Cat, Animal, 2
Dog, Animal, 3
Luke, Human, 1
Owl, Animal, 0
现在我要搜索列表,查找包含动物的所有字符串元素,并在其编号中添加一个。因此,在我的查询结束时,列表将如下所示:
Cat, Animal, 3
Dog, Animal, 4
Luke, Human, 1
Owl, Animal, 1
我如何实现此功能?我正在考虑使用LINQ查询来获取包含animal的所有条目,然后获取列表中每个元素的索引,通过使用逗号分割获取每个元素中的所有标记,将第三个标记解析为整数,递增通过一个并重写以前保存的索引中的元素来更新计数。这可能是效率最低的方法,所以任何人都可以建议一个快速,简短和甜蜜的解决方案吗?
由于
答案 0 :(得分:6)
我建议创建一个表示列表行的类,而不是分割和搜索字符串,这是非常低效的,特别是如果您多次处理列表,例如
public class Creature
{
public string Name { get; set; };
public string Species { get; set; };
public int Count { get; set; };
}
可以更轻松地访问存储在列表中的这些内容。你的字符串的内容必须转换两次:如果你从一个文件中读取它们,则在程序开始时为1st;如果你想再次存储它们,则在结尾处为第二个。
您可以使用LINQ来搜索您搜索的结果:
listOfCreatures.Where(creature => creature.Species == "Animal").ToList();
答案 1 :(得分:0)
以下是一些示例代码,用于演示您所描述的内容:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var content = new string[] { "Cat, Animal, 2", "Dog, Animal, 3", "Luke, Human, 1", "Owl, Animal, 0" };
foreach (var item in content)
{
Console.WriteLine(IncrementIfKeywordFound(item, "Animal"));
}
Console.ReadLine();
}
private static string IncrementIfKeywordFound(string data, string keyword)
{
var parts = data.Split(new [] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts[1] == keyword) parts[2] = (Convert.ToInt32(parts[2]) + 1).ToString();
return string.Join(", ", parts);
}
}
}
答案 2 :(得分:0)
假设这是一个List或任何可以转换为
的东西for(i = 0;i < yourList.Count; i++)
{
String str = yourList[i];
if(str.Contains("Animal")
{
var parts = string.Split(@',');
parts[2] = Integer.Parse(parts[2]) + 1;
str = String.Join(parts, ",");
}
}
只读一次,只在需要更改时才写。
答案 3 :(得分:0)
使用正则表达式。只是为了踢,不要这样做,它不是很灵活也不可维护。
static void Main(string[] args)
{
string source = @"Cat, Animal, 2
Dog, Animal, 3
Luke, Human, 1
Owl, Animal, 0";
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@", Animal, (\d+)");
foreach (string line in source.Split(new string[] { Environment.NewLine },StringSplitOptions.RemoveEmptyEntries))
{
System.Text.RegularExpressions.MatchCollection collection = r.Matches(line);
if (collection.Count == 1)
{
int val = -1;
int.TryParse(collection[0].Groups[1].Value, out val);
Console.WriteLine(line.Replace(val.ToString(), (val + 1).ToString()));
}
else
{
Console.WriteLine(line);
}
}
}
答案 4 :(得分:0)
以下是Linq表达式的答案:
List<string> source = new List<string>();
source.Add("Cat, Animal, 2");
source.Add("Dog, Animal, 3");
source.Add("Luke, Human, 1");
source.Add("Owl, Animal, 0");
List<string> dest = new List<string>(
source
.Select(s => s.Split(new []{',', ' '}, StringSplitOptions.RemoveEmptyEntries))
.Select(s => { if(s[1] == "Animal") s[2] = (Convert.ToInt32(s[2]) + 1).ToString(); return s; })
.Select(s => String.Join(", ", s))
);
答案 5 :(得分:0)
这是一个粗略的例子。将CSV加载到“表”中,然后修改它并写回文件。
public static List<string[]> LoadCSV() {
List<string[]> table = new List<string[]>();
// Replace the below with something like File.ReadAllLines(...);
string[] lines = "Cat, Animal, 3\r\nDog, Animal, 4\r\nLuke, Human, 1\r\nOwl, Animal, 1"
.Split(new string[] { "\r\n" }, StringSplitOptions.None);
foreach (string line in lines) {
table.Add(line.Split(new string[] { ", " }, StringSplitOptions.None));
}
return table;
}
static void Main(string[] args) {
List<string[]> items = LoadCSV();
foreach (string[] item in items) {
if (item[2] == "Animal") {
item[2] = (int.Parse(item[1]) + 1).ToString();
}
}
// Write back to file
}
相反,您可以创建一个AnimalList类来存储类型类'Animal'的集合,该集合将定义属性Animal / Type / Value(或您想要调用它们的属性),并编写您自己的Add / Remove / Save /加载方法。
答案 6 :(得分:0)
我首先创建一个类来保存列表中的每个项目。
public class Creature
{
public string Name { get; set; }
public string Species { get; set; }
public int Count { get; set; }
public Creature(string name, string species, int count)
{
this.Name = name;
this.Species = species;
this.Count = count;
}
public void Add(int numToAdd)
{
this.Count += numToAdd;
}
}
public static class CreatureStorage
{
private static bool isInitialized = false;
private static List<Creature> creatureList = new List<Creature>();
public static List<Creature> CreatureList
{
get {
if (isInitialized == false)
{
Initialize();
}
return creatureList;
}
set { creatureList = value; }
}
public static void Add(string species, int numToAdd)
{
foreach (Creature creature in creatureList)
{
if (creature.Species.Equals(species))
{
creature.Add(numToAdd);
}
}
}
private static void Initialize()
{
// Add code to parse through your initial list whether it's a txt file or just a string in the application
isInitialized = true;
}
使用示例。
public partial class ProcessAnimals : Form
{
public ProcessAnimals()
{
InitializeComponent();
}
private void processAnimals_Click(object sender, EventArgs e)
{
CreatureStorage.Add("Animal", 1);
}
}