我是C#的新手,我遇到了以下问题(我在这里和谷歌寻找解决方案,但没有成功):
给定一个字符串数组(某些列可能是字符串格式的“双精度”或“整数”)我想将此数组转换为整数数组。 该问题仅涉及具有实际字符串值的列(例如国家/地区列表)。
现在我相信一个词典可以帮助我识别给定列中的唯一值,并将整数与出现的每个国家相关联。 然后创建我应该是int(或double)类型的新数组,我可以遍历整个数组并通过字典定义新数组。我需要为每个具有字符串值的列执行此操作。 这似乎效率低下,还有更好的方法吗?
最后,我想对数据进行多元线性回归(甚至拟合广义线性模型,这意味着我想得到最终的设计矩阵)。
编辑: 1)很抱歉不清楚,我会尽力澄清:
假设:
MAKE; VALUE; GENDER
奥迪; 40912.2; m
WV; 3332; f
奥迪; 1234.99; m
DACIA; 0; m
奥迪; 12354.2; m
奥迪; 123; m
大众; 21321.2; f
我想得到一个“数字”矩阵,其中包含字符串值列的标识符
MAKE; VALUE; GENDER
1; 40912.2; 0
2; 3332; 1
1; 1234.99; 0
3; 0; 0
1; 12354.2; 0
1; 123; 0
2; 21321.2; 1
2)我认为这实际上不是我解决问题所需要的。它似乎仍然是一个有趣的问题。
3)感谢您到目前为止的回复。
答案 0 :(得分:0)
这将获取表示整数的所有可能字符串并将它们放入List中。 您可以使用代表双精度的字符串执行相同的操作。 这是你的意思吗?
List<int> myIntList = new List<int>()
foreach(string value in stringArray)
{
int myInt;
if(Int.TryParse(value,out myInt)
{
myIntList.Add(myInt);
}
}
如果你想将每个字符串映射到这样的键,
var myDictionary = new Dictionary<int,string>();
myDictionary.Add(1,"CountryOne");
myDictionary.Add(2,"CountryTwo");
myDictionary.Add(3,"CountryThree");
然后你可以得到你的价值观:
string myCountry = myDictionary[2];
但仍然不确定我现在是否在帮助你。你有som代码来指明你的意思吗?
答案 1 :(得分:0)
我不确定这是否是您正在寻找的,但它会输出您正在寻找的结果,您可以从中创建适当的数据结构。我使用字符串列表,但您可以使用其他东西来保存已处理的数据。如果需要,我可以进一步扩展。
它确实假设基于分号字符的&#34;列&#34;的数量在整个数据中是相等的,并且足够灵活以处理任意数量的列。它有点难看,但应该得到你想要的东西。
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication3
{
class StringColIndex
{
public int ColIndex { get; set; }
public List<string> StringValues {get;set;}
}
class Program
{
static void Main(string[] args)
{
var StringRepresentationAsInt = new List<StringColIndex>();
List<string> rawDataList = new List<string>();
List<string> rawDataWithStringsAsIdsList = new List<string>();
rawDataList.Add("AUDI;40912.2;m");rawDataList.Add("VW;3332;f ");
rawDataList.Add("AUDI;1234.99;m");rawDataList.Add("DACIA;0;m");
rawDataList.Add("AUDI;12354.2;m");rawDataList.Add("AUDI;123;m");
rawDataList.Add("VW;21321.2;f ");
foreach(var rawData in rawDataList)
{
var split = rawData.Split(';');
var line = string.Empty;
for(int i= 0; i < split.Length; i++)
{
double outValue;
var isNumberic = Double.TryParse(split[i], out outValue);
var txt = split[i];
if (!isNumberic)
{
if(StringRepresentationAsInt
.Where(x => x.ColIndex == i).Count() == 0)
{
StringRepresentationAsInt.Add(
new StringColIndex { ColIndex = i,
StringValues = new List<string> { txt } });
}
var obj = StringRepresentationAsInt
.First(x => x.ColIndex == i);
if (!obj.StringValues.Contains(txt)){
obj.StringValues.Add(txt);
}
line += (string.IsNullOrEmpty(line) ?
string.Empty :
("," + (obj.StringValues.IndexOf(txt) + 1).ToString()));
}
else
{
line += "," + split[i];
}
}
rawDataWithStringsAsIdsList.Add(line);
}
rawDataWithStringsAsIdsList.ForEach(x => Console.WriteLine(x));
Console.ReadLine();
/*
Desired output:
1;40912.2;0
2;3332;1
1;1234.99;0
3;0;0
1;12354.2;0
1;123;0
2;21321.2;1
*/
}
}
}