1

大家好,

我有一个类和一个属性,并且我有该类的三个实例。

public class myclass {
  public int myproperty;
}

...

myclass inst1, inst2, inst3;

...

现在在某个时刻,我需要比较这三个属性值,并验证它们是否相等,以得到最少的值。

所以如果我有

inst1.myproperty = 3;
inst2.myproperty = 5;
inst3.myproperty = 3;

在 magic_function_call 之后,我应该得到 3 和 5。

如果我有

inst1.myproperty = 2;
inst2.myproperty = 2;
inst3.myproperty = 2;

在 magic_function_call 之后,我应该得到 2。

尽管这本身很简单,并且可以根据需要通过尽可能多的 IF 检查来解决,但我想知道哪种方法是最快或更有效的方法,特别是考虑到我可能需要添加另一个变量到将来的检查。

事实上,我想知道是否有可以执行的按位运算可以优雅而快速地解决这个问题。

或者,是否有可用于实现相同目标的数组操作?我试过寻找“减少”或“压缩”,但这些关键字似乎并没有朝着正确的方向发展。

提前致谢。

4

3 回答 3

4

如果所有实例都属于一个集合,则可以使用morelinq查询运算符: DistinctBy

List<MyClass> myList = new List<MyClass>();
.. populate list
List<MyClass> distinct = myList.DistinctBy(mc => mc.myproperty).ToList();

查看问题,您可能需要一个仅包含属性值的列表(整数列表),您可以使用标准查询运算符来实现:

List<int> distinct = myList.Select(mc => mc.myproperty).Distinct().ToList();

请注意,您尚未定义属性,而是定义了公共字段。要定义自动属性更改:

public int myproperty;

public int myproperty { get; set; }

另请注意,PascalCasing 建议用于属性和类名称。

于 2012-02-24T08:21:30.837 回答
1

这是一个不需要任何额外库并避免与 LINQ 相关的设置成本和开销的快速函数:

    static int[] Reduce(IEnumerable<myclass> items)
    {
        HashSet<int> uniqueValues = new HashSet<int>();

        foreach (var item in items)
        {
            uniqueValues.Add(item.myproperty);
        }

        return uniqueValues.ToArray();
    }

将您的 myclass 实例的集合传递给它,它将返回一组唯一的 myproperty 值。

于 2012-02-24T09:01:13.227 回答
1

只是另一种方式来实现它。

var result = myList.GroupBy(p => p.myproperty).Select(p => p.First());
于 2012-02-24T08:52:12.733 回答