2

问题描述:

我有一个表示向量的 double[] 值列表,其中第 0 个向量元素对应于向量的物理长度,其他三个(1 到 3)对应于 x、y 和 z 分量。该列表包含大约 1000000 个条目。所以perfermence将是一个问题。我根据向量的长度对列表进行了排序。现在我需要过滤列表,以便保留不同长度的向量,如果长度相同,则过滤位置 1 到 3 上包含不同条目(不是排列)的向量,如示例所示。如果您需要更多信息,请告诉我。在过滤过程中不应更改向量。

问题:如何使用 C# 以及如果可能的 linq 来实现这一点?

例子:

 0,    0,     0;      0,0000   ->   select 
 0,    1,    -1;      8,2883   ->   select
 1,    0,    -1;      8,2883   ->   not select
 0,   -1,     1;      8,2883   ->   not select
-1,    0,     1;      8,2883   ->   not select
 1,   -1,     0;      8,2883   ->   not select
-1,    1,     0;      8,2883   ->   not select
 1,    1,    -2;     14,3558   ->   select
...
 2,     2,    -5;    38,6145   ->   select
-2,    -2,     5;    38,6145   ->   not select
 1,     4,    -4;    38,6145   ->   select
 4,     1,    -4;    38,6145   ->   not select
-1,    -4,     4;    38,6145   ->   not select
-4,    -1,     4;    38,6145   ->   not select
-1,     4,    -4;    38,6145   ->   not select
 4,    -1,    -4;    38,6145   ->   not select
-4,     1,     4;    38,6145   ->   not select
 1,    -4,     4;    38,6145   ->   not select
-2,     5,    -2;    38,6145   ->   not select
 5,    -2,    -2;    38,6145   ->   not select
 2,    -5,     2;    38,6145   ->   not select
-5,     2,     2;    38,6145   ->   not select
 4,    -4,    -1;    38,6145   ->   not select
-4,     4,    -1;    38,6145   ->   not select
-4,     4,     1;    38,6145   ->   not select
 4,    -4,     1;    38,6145   ->   not select
...

代码:

private static double absm = 0;
private static int[] m = new int[3];
private static int[] m2 = new int[3];
private static List<double[]> ihkl1 = new List<double[]>();
private static List<double[]> ihkl2 = new List<double[]>();

...

private static void init_latt()
{
    for (int i = -kmax[2]; i < kmax[2]; i++ )
    {
        m[2] = i;
        for (int j = -kmax[1]; j < kmax[1]; j++)
        {
            m[1] = j;
            for (int k = -kmax[0]; k < kmax[0]; k++)
            {                        
                m[0] = k;
                absm = calcabsm(metten, m);                                             
                if (absm < gmax)
                {
                    double[] row1 = new double[4];
                    row1[0] = absm;
                    row1[1] = (double)m[0];
                    row1[2] = (double)m[1];
                    row1[3] = (double)m[2];
                    ihkl1.Add(row1);
                }
            }
        }
    }    
    ihkl2 = ihkl1.AsParallel().OrderBy(x => x[0]).ToList();
}
...
4

1 回答 1

0

首先,我同意Jon SkeetVector关于使用封装这些double数组的类的建议。之后,您可以执行以下操作:

public class VectorEqualityComparer : IEqualityComparer<Vector>
{
    public bool Equals(Vector x, Vector y)
    {
        //here you implement the equality among vectors you defined in your question
    }

    public int GetHashCode(Vector obj)
    {
        //you can return something like obj.InnerArray.GetHashCode()
    }
}

现在,如果您有 的列表Vector,即yourList,您可以调用:

var result = yourList.Distinct(new VectorEqualityComparer());

希望这可以帮助你实现你想要的。祝你好运!!!

于 2013-03-12T14:55:55.600 回答