我想用1个键,2个值创建一个数据结构,如下所示:
List<KeyValuePair<double, double, double>> list = new List<KeyValuePair<double, double, double>>();
我基本上有x,y,z坐标值,我想继续将它们附加到数据结构中。之后,追加数据,我想检索所有可用的“x”(类似“List”) 。对于x的每个值,我想找到多个“y”值。然后对于特定的“x”和“y”值,我想找到所有多个“z”值。
例如:如果我有坐标(1,2,3); (1,3,4); (1,2,6); (1,2,9) 对于值1,我想检索2和3.同样,值为1,2;我想检索值6和9。
如果有人能让我知道在C#中执行此操作的程序,我会很高兴。 提前致谢。
答案 0 :(得分:1)
您没有唯一的密钥,并且您拥有不同宽度的密钥,因此字典或KeyValuePair将帮助您。
如果在查找单个值((1, 2, 3)
的X)时,您只对Y感兴趣而且从不对Z感兴趣,您可以使用未使用的值填充密钥并将记录存储两次(因此密钥 - 价值对(0, 1, 2)
变为(1, 2, 3)
和List<Tuple<double, double, double>>
),但这并不会让事情变得更清晰。
您可以将记录存储在var list = new List<Tuple<double, double, double>>
{
Tuple.Create<double, double, double>(1,2,3),
Tuple.Create<double, double, double>(1,3,4),
Tuple.Create<double, double, double>(1,2,6),
Tuple.Create<double, double, double>(1,2,9),
};
var search = 1d;
var results = list.Where(t => t.Item1 == search)
.Select(t => t.Item2);
:
var search = Tuple.Create<double, double>(1, 2);
var results = list.Where(t => t.Item1 == search.Item1 && t.Item2 == search.Item2)
.Select(t => t.Item3);
然后,当您想要搜索两个值时,也可以使用元组:
<head>
<?php $page = basename(__FILE__, '.php'); ?>
<title><?php echo ucfirst($page); ?><title>
</head>
答案 1 :(得分:0)
基本上是CodeCaster的答案,但有方法(我花时间创建它,但他更快:))
public void TestMethod()
{
List<Tuple<double, double, double>> list = new List<Tuple<double, double, double>>();
list.Add(new Tuple<double, double, double>(1, 2, 3));
list.Add(new Tuple<double, double, double>(1, 2, 5));
list.Add(new Tuple<double, double, double>(8, 2, 3));
list.Add(new Tuple<double, double, double>(1, 5, 3));
var x = GetIt(1, list);
var y = GetIt(1, 2, list);
}
public List<double> GetIt(double d, List<Tuple<double, double, double>> list)
{
return (from a in list
where a.Item1 == d
select a.Item2).Distinct().ToList();
}
public List<double> GetIt(double d, double e, List<Tuple<double, double, double>> list)
{
return (from a in list
where a.Item1 == d && a.Item2 == e
select a.Item3).Distinct().ToList();
}
答案 2 :(得分:-1)
您需要多种方法。如果你正在使用VS2017 +,你可以使用Value Tuple(在定位.NET4.7时是原生的,否则在Nuget中可用)
var list = new List<(double x, double y, double z)>();
list.Add((1,2,3));
list.Add((1,3,4));
list.Add((1,2,6));
list.Add((1,2,9));
并使用Linq按x,y和z进行分组。
使用x = 1
检索所有yvar l1 = list.Where(i=>i.x==1).Select(i=>i.y);
要检索x = 1且y = 2
的所有zvar l2 = list.Where(i=>i.x==1 && i.y==2).Select(i=>i.z);
答案 3 :(得分:-1)
我不建议使用字典类型方法,因为您尝试存储的是3个值,而不是键和值。
我建议如下:
例如:
public class Coordinates
{
public float XCoord { get; set; }
public float YCoor { get; set; }
public float ZCoor { get; set; }
}
然后你可以创建一个列表并使用LINQ来选择所需的数据,在这个例子中我创建了一个接受X,Y和Z来过滤列表的函数。
List<Coordinates> list = new List<Coordinates>(); //Populate the list
然后使用以下方法:
public List<Coordinates> SelectCoords(List<Coordinates> originalList, float? X, float? Y,float? Z)
{
List<Coordinates> filteredList = new List<Coordinates>(originalList);
if (X != null)
{
filteredList = filteredList.Where(v => v.XCoord == X).ToList();
}
if (Y != null)
{
filteredList = filteredList.Where(v => v.YCoord == Y).ToList();
}
if (X != null)
{
filteredList = filteredList.Where(v => v.ZCoord == Z).ToList();
}
return filteredList;
}
让您选择如何过滤列表,仅返回包含X,Y和Z的列表
list = SelectCoords(list, 1, 2,null);
答案 4 :(得分:-2)