使用1个密钥创建数据结构,在C#中创建2个值,并检索特定键的值

时间:2017-12-12 15:34:27

标签: c# algorithm data-structures

我想用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#中执行此操作的程序,我会很高兴。 提前致谢。

5 个答案:

答案 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

检索所有y
var l1 = list.Where(i=>i.x==1).Select(i=>i.y);

要检索x = 1且y = 2

的所有z
var l2 = list.Where(i=>i.x==1 && i.y==2).Select(i=>i.z);

答案 3 :(得分:-1)

我不建议使用字典类型方法,因为您尝试存储的是3个值,而不是键和值。

我建议如下:

  1. 创建一个类Coordinates
  2. 列出所说的课程
  3. 使用LINQ来完成它。
  4. 例如:

     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)

为了以防万一,女士得到了你的回报并为此准备了课程:Point3D structure

优点:它有许多可以使用的构建方法。你可以玩点和矢量。

缺点:如果您只是存储这3个双倍,那就太过分了。