C# 如何比较多维字符串数组?
我想比较两个字段。i、 换台机器并通过 我想根据Machine和pass的值连接“Color”C# 如何比较多维字符串数组?,c#,arrays,string,multidimensional-array,C#,Arrays,String,Multidimensional Array,我想比较两个字段。i、 换台机器并通过 我想根据Machine和pass的值连接“Color” --------------|------------------|------------ Color1 | Machine 1 | Pass 1 --------------|------------------|------------ Color2 | Machine 2 | Pass 1 --------------|-------
--------------|------------------|------------
Color1 | Machine 1 | Pass 1
--------------|------------------|------------
Color2 | Machine 2 | Pass 1
--------------|------------------|------------
Color3 | Machine 1 | Pass 1
--------------|------------------|------------
Color4 | Machine 1 | Pass 2
--------------|------------------|------------
Color5 | Machine 2 | Pass 1
--------------|------------------|------------
Color6 | Machine 2 | Pass 2
--------------|------------------|------------
我希望结果如下
private void button1_Click(object sender, EventArgs e)
{
var ary = new[]
{
"Color1 | Machine 1 | Pass 1 ",
"Color2 | Machine 2 | Pass 1 ",
"Color3 | Machine 1 | Pass 1 ",
"Color4 | Machine 1 | Pass 2 ",
"Color5 | Machine 2 | Pass 1 ",
"Color6 | Machine 2 | Pass 2 "
};
var seprated = from x in ary.Select(x => x.Split('|'))
select new
{
key = x[1].Trim() + "&" + x[2].Trim(),
value = x[0]
};
var sb = new StringBuilder();
foreach (var key in seprated.Select(x => x.key).Distinct())
{
var colors = seprated.Where(x => x.key == key).Select(x => x.value.Trim()).ToArray();
sb.AppendLine(string.Format("{0} for {1}", string.Join("/", colors), key));
}
textBox1.Text = sb.ToString();
}
sb.toString()具有以下结果:
机器1和通道1的颜色1/3
机器2和通道1的颜色2/5
机器1和通道2的颜色4
机器2和过程2的颜色6
var multidimensionalArray = new[,]
{
{"Color1", "Machine 1", "Pass 1"},
{"Color2", "Machine 2", "Pass 1"},
{"Color3", "Machine 1", "Pass 1"},
{"Color4", "Machine 1", "Pass 2"},
{"Color5", "Machine 2", "Pass 1"},
{"Color6", "Machine 2", "Pass 2"}
};
var tuple = new List<Tuple<string, string, string>>();
for (var i = 0; i < multidimensionalArray.Length/3-1; i++)
{
tuple.Add(new Tuple<string, string, string>(multidimensionalArray[i, 0], multidimensionalArray[i, 1], multidimensionalArray[i, 2]));
}
foreach (var el in tuple.GroupBy(x => String.Format("{0} & {1}", x.Item2, x.Item3), y => y.Item1))
{
Console.WriteLine(String.Join("/", el) + " for " + el.Key);
}
{
{“Color1”、“Machine 1”、“Pass 1”},
{“Color2”,“machine2”,“pass1”},
{“Color3”,“Machine 1”,“Pass 1”},
{“Color4”,“Machine 1”,“Pass 2”},
{“Color5”、“Machine 2”、“Pass 1”},
{“Color6”、“机器2”、“通过2”}
};
var tuple=新列表();
对于(变量i=0;i您没有提供类定义,因此我假设它是以下内容
class PaintMachineInfo
{
public string ColorName {get; set;}
public string MachineName {get; set;}
public string Pass {get; set;}
}
通过使用,您可以很容易地获得所需的结果,它允许您提供一个键,并提供与该键匹配的IEnumerable结果
我喜欢使用自定义类作为查找键,而不是使用元组
,因为它使您看到的内容更加明显,并且创建类的代码也不太多
private static void Main(string[] args)
{
List<PaintMachineInfo> info = GenerateInfo();
var filteredResults = info.ToLookup(line => new PaintMachineLookup(line.MachineName, line.Pass), line => line.ColorName);
//Contains a IEnumerable<string> containing the elements "Color1" and "Color3"
var result1 = filteredResults[new PaintMachineLookup("Machine 1", "Pass 1")];
}
private static List<PaintMachineInfo> GenerateInfo()
{
//...
}
class PaintMachineInfo
{
public string ColorName { get; set; }
public string MachineName { get; set; }
public string Pass { get; set; }
}
internal class PaintMachineLookup
{
public PaintMachineLookup(string machineName, string pass)
{
MachineName = machineName;
Pass = pass;
}
public string MachineName { get; private set; }
public string Pass { get; private set; }
public override int GetHashCode()
{
unchecked
{
int x = 27;
x = x * 11 + MachineName.GetHashCode();
x = x * 11 + Pass.GetHashCode();
return x;
}
}
public override bool Equals(object obj)
{
var other = obj as PaintMachineLookup;
if (other == null)
return false;
return MachineName.Equals(other.MachineName) && Pass.Equals(other.Pass);
}
}
private static void Main(字符串[]args)
{
列表信息=生成信息();
var filteredResults=info.ToLookup(line=>newpaintmachinelookup(line.MachineName,line.Pass),line=>line.ColorName);
//包含包含元素“Color1”和“Color3”的IEnumerable
var result1=filteredResults[新喷漆机查看(“机器1”,“通过1”)];
}
私有静态列表GenerateInfo()
{
//...
}
类PaintMachineInfo
{
公共字符串ColorName{get;set;}
公共字符串MachineName{get;set;}
公共字符串传递{get;set;}
}
内部类喷漆机外观
{
公共绘画机器观察(字符串机器名称、字符串传递)
{
MachineName=MachineName;
通过=通过;
}
公共字符串MachineName{get;private set;}
公共字符串传递{get;private set;}
公共覆盖int GetHashCode()
{
未经检查
{
int x=27;
x=x*11+MachineName.GetHashCode();
x=x*11+Pass.GetHashCode();
返回x;
}
}
公共覆盖布尔等于(对象对象对象)
{
var other=喷漆机观察时的obj;
如果(其他==null)
返回false;
返回MachineName.Equals(other.MachineName)和Pass.Equals(other.Pass);
}
}
首先,从概念上讲,这里真正拥有的是一个复杂对象的单一维度,它具有颜色、机器和传递值。将其存储在二维数组中不是一个好主意。更好的表示是某种自定义类型的列表
,因此让我们先进行转换
首先,我们将定义一个自定义类型来表示输入数据:
public class MachinePass//TODO consider renaming
{
public string Color { get; set; }
public string Machine { get; set; }
public string Pass { get; set; }
}
然后,我们将解析输入并将其放入适当的结构中:
var list = new List<MachinePass>();
for (int i = 0; i < data.GetLength(0); i++)
{
var next = new MachinePass();
next.Color = data[i, 0];
next.Machine = data[i, 1];
next.Pass = data[i, 2];
list.Add(next);
}
然后,我们可以按照定义的格式打印此查询的结果:
foreach(var group in query)
Console.WriteLine("{0} for {1} & {2}",
string.Join("/", group),
group.Key.Machine,
group.Key.Pass);
提供数组的实际声明。回答起来容易多了。这个答案看起来最有希望,因为我猜他还没有一个数组(集合)将这三个值组合在一起,以便将它们分开,以便重新组合在一起…@WonkotheSane在这种情况下,从使用
.ToLookup改为ToLookup
,是很简单的(line=>new PaintMachineLookup(line.MachineName,line.Pass),line=>line.ColorName)
to.ToLookup(line=>new PaintMachineLookup(line[1],line[2]),line=>line[0])
(假设info
是一个字符串[]
)@ScottChamberlain但他说他有一个多维数组不是多维数组。在多维数组上执行转换并不是那么简单。@Servy fair point。我不确定如何才能为字符串[,]获取它
,我不经常使用它们。@ScottChamberlain认为我的答案有一种可能性。虽然你可以使用LINQ,但我发现不使用LINQ更容易。OP说输入是一个多维字符串数组,而不是元组列表。此外,将字符串压缩在一起是一种非常容易出现错误的方法,可以对两个值进行分组。如果机器1的lue为“12”,传递为“3”。它将与一行分组,其中机器值为“1”,传递为“23”。使用“&”delimiter有点帮助,但如果基础数据中的每个值之间都存在分隔符,那么它仍然可能失败。我怀疑,OP从SQL获取数据,只想使用字符串并寻找概念方法。我不明白数据是否来自SQL有什么关系;它仍然不是创建字符串的合适概念一个键。它可能导致冲突。适当的概念是创建一个新对象来表示多个值,这些值可以具有适当的“相等”定义。当然可以。但OP想要的是多维字符串数组,而不是对象。如何组织数据存储:为过程和计算机创建外键。使用EntityFramework连接到数据库。另一种创建SQL视图的方法,它将数据透视分组
foreach(var group in query)
Console.WriteLine("{0} for {1} & {2}",
string.Join("/", group),
group.Key.Machine,
group.Key.Pass);