2

我定义了以下对象:

public class MyGroup
{
    public MyItem[] Items;
}

public class MyItem
{
    public int Val;
}

假设我有一个列表作为列表,其中每个 MyGroup 对象包含不同数量的 MyItems;这反过来又包含 Val 的变化值。

如何在所有 MyGroup 对象中找到包含最低 Val 的 MyGroup 对象子集。

例如:如果我用以下值定义列表

  • MyGroup1包含以下每个值的 MyItem:1、5 和 7
  • MyGroup2包含以下每个值的 MyItem:3 和
    8
  • MyGroup3包含以下每个值的 MyItem:2、4、5 和 7

然后返回的值将是MyGroup1(作为单个项目列表),因为它包含值 1,这是所有值中的最低值。

但是,如果有多个具有最低值的值,例如:

  • MyGroup1包含以下每个值的 MyItem:1、5 和 7
  • MyGroup2包含以下每个值的 MyItem:3 和 8
  • MyGroup3包含以下每个值的 MyItem:1、4、5 和 7

然后它将在列表中返回MyGroup1MyGroup3

提前致谢。

4

5 回答 5

5
int lowestValue = groups.SelectMany(group => group.Items)
                  .Min(item => item.Val);

IEnumerable<MyGroup> result = groups.Where(group => 
    group.Items.Select(item => item.Val).Contains(lowestValue));

这将是一个两遍算法。如果您有适当的动机,您可以通过在搜索该最小值时跟踪包含最小值的所有项目来一次性完成。

于 2012-07-06T15:57:09.780 回答
1
    var myGroup1 = new MyGroup();
    myGroup1.Items = Enumerable.Range (1,3).Select (x=> new MyItem {Val=x}).ToArray();
    var myGroup2 = new MyGroup();
    myGroup2.Items = Enumerable.Range (1,4).Select (x=> new MyItem {Val=x}).ToArray();
    var myGroup3 = new MyGroup();
    myGroup3.Items = Enumerable.Range (3,5).Select (x=> new MyItem {Val=x}).ToArray();


    var groupList = new List<MyGroup>();
    groupList.Add(myGroup1);
    groupList.Add(myGroup2);
    groupList.Add(myGroup3);

    var filterGroups = groupList.Select ( x=>new {Group=x, Min=x.Items.Select( y=> y.Val).Min()}).GroupBy (x=>x.Min).OrderBy (x=>x.Key).Take(1).SelectMany (x=> x).Select (x=>x.Group);

由于嵌套数据结构,最后一个查询非常大。

以下是解释

groupList //MyGroup
.Select ( x=>new {Group=x, Min=x.Items.Select( y=> y.Val).Min()})列表 // 组列表和最小值

.GroupBy (x=>x.Min).OrderBy (x=>x.Key)按最小值分组并排序
.Take(1)// 取第一项
.SelectMany (x=> x)//(MyGroups 的最小值列表)
.Select (x=>x.Group); // 只选择 MyGroups,忽略 Key

于 2012-07-06T16:04:42.177 回答
0
   var query = from gr in myGroups
               where gr.Items.Any(x => x.Val ==
                 (from g in myGroups
                  from i in g.Items
                  orderby i.Val
                  select i.Val).FirstOrDefault())
               select gr;
于 2012-07-06T16:08:26.850 回答
0

这是我刚刚为此编写的代码片段。它是 的扩展方法IEnumerable<T>,它基于“排序”函数返回一个最小元素(实际上没有进行排序,或执行两次传递,并且没有两次传递时发生的竞争条件)。

/// <summary>
/// Get the minimum element, based on some property, like a distance or a price.
/// </summary>
static public T MinElement<T>(this IEnumerable<T> list, System.Func<T, float> selector)
{
    T ret = default(T);
    float minValue = float.MaxValue;
    foreach (T elem in list)
    {
        float value = selector(elem);
        if (value <= minValue)
        {
            ret = elem;
            minValue = value;
        }
    }

    return ret;
}
于 2015-03-02T05:28:04.227 回答
-2

将此添加到您的 Linq 查询中: .FirstOrDefault(); 你只得到一个值。

于 2012-07-06T15:58:15.923 回答