0

我创建了一个二维列表,并希望返回最大值、最小值以及与这些值具有相同索引的名称。

这就是我所做的。

class Info
{
    private string stad;
    private double temperatur;

    public string Stad
    {
        get { return stad; }
        set { stad = value; }
    }

    public double Temperatur
    {
        get { return temperatur; }
        set { temperatur = value; }
    }
}

    static double SearchMax(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        double Temperatur = double.MinValue;
        foreach (Info temperatur in list)
        {
            if (temperatur.Temperatur > Temperatur)
            {
                Temperatur = temperatur.Temperatur;
            }        
        }
        return Temperatur;
    }

    static double SearchMin(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        double Tempertatur = double.MaxValue;
        foreach (Info temperatur in list)
        {
            if (temperatur.Temperatur < Tempertatur)
            {
                Tempertatur = temperatur.Temperatur;
            }
        }
        return Tempertatur;
    }

但我得到的只是最大值和最小值,而不是温度所在城市的名称。

谁能告诉我或告诉我如何返回两者?

感谢您提供的所有帮助,但这只是让我回到了在此发布之前的位置。我想要的是让程序返回城市和城市的温度,即“最温暖的城市是奥斯陆,它的温度是 20°C”,而不是“最温暖的城市是 consoleaplication.info”

编辑:2 感谢您的帮助,尤其是 Alex ^_^

4

5 回答 5

2

一个非常紧凑但效率低下的 LINQ 解决方案:

static Info SearchMin(List<Info> list)
{
     return data.OrderBy(i => i.Temperatur).First();
}

但是您可能想要调整自己的代码:

static Info SearchMin(List<Info> list)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Tomt Lista");
    }
    double Tempertatur = double.MaxValue;
    Info result = null;

    foreach (Info temperatur in list)
    {
        if (temperatur.Temperatur < Tempertatur)
        {
            Tempertatur = temperatur.Temperatur;
            result = temperatur;
        }
    }
    return result;
}

如您所见,要点是返回 anInfo而不是 a double

于 2013-01-17T21:06:24.000 回答
2

您可以使用 MoreLinq 中的MaxByMinBy方法来执行此操作。

public static partial class MoreEnumerable
{
    public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector)
    {
        return source.MaxBy(selector, Comparer<TKey>.Default);
    }

    public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector, IComparer<TKey> comparer)
    {
        using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
        {
            if (!sourceIterator.MoveNext())
            {
                throw new InvalidOperationException("Sequence was empty");
            }
            TSource max = sourceIterator.Current;
            TKey maxKey = selector(max);
            while (sourceIterator.MoveNext())
            {
                TSource candidate = sourceIterator.Current;
                TKey candidateProjected = selector(candidate);
                if (comparer.Compare(candidateProjected, maxKey) > 0)
                {
                    max = candidate;
                    maxKey = candidateProjected;
                }
            }
            return max;
        }
    }
    public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector)
    {
        return source.MinBy(selector, Comparer<TKey>.Default);
    }

    public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector, IComparer<TKey> comparer)
    {
        using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
        {
            if (!sourceIterator.MoveNext())
            {
                throw new InvalidOperationException("Sequence was empty");
            }
            TSource min = sourceIterator.Current;
            TKey minKey = selector(min);
            while (sourceIterator.MoveNext())
            {
                TSource candidate = sourceIterator.Current;
                TKey candidateProjected = selector(candidate);
                if (comparer.Compare(candidateProjected, minKey) < 0)
                {
                    min = candidate;
                    minKey = candidateProjected;
                }
            }
            return min;
        }
    }
}

(编辑删除注释和参数的空检查。)

一旦你有了它,它就很简单了:

Info maxInfo = list.MaxBy(item => item.Temperatur);
Info minInfo = list.MinBy(item => item.Temperatur);
于 2013-01-17T21:06:42.667 回答
0

当然可以稍微调整一下以使其更短:

var maxtemp = list.Max(x => x.Temperatur);
var maxstad = list.First(x => x.Temperatur == maxtemp).Stad;

var mintemp = list.Min(x => x.Temperatur);
var minstad = list.First(x => x.Temperatur == mintemp).Stad;
于 2013-01-17T21:06:12.847 回答
0

您可以直接订购Temperatur并拿第一个。

这在 BIG 列表上可能会很慢

    static Info SearchMax(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        return list.OrderByDescending(i => i.Temperatur).FirstOrDefault();
    }

    static Info SearchMin(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
         return list.OrderBy(i => i.Temperatur).FirstOrDefault();;
    }
于 2013-01-17T21:08:15.690 回答
0
private static TempratureInfo FindHighestTemprature(IList<TempratureInfo> tempratures)
{
    if(tempratures.Count == 0)
        throw new InvalidOperationException("tempratures");

    return tempratures.OrderByDescending(t => t.Temprature)
                      .First();
}

private static TempratureInfo FindLowestTemprature(IList<TempratureInfo> tempratures)
{
    if (tempratures.Count == 0)
        throw new InvalidOperationException("tempratures");

    return tempratures.OrderBy(t => t.Temprature)
                      .First();
}

您可以修改您的Info类以覆盖ToString,当您调用上述任何一个函数时,当需要字符串、参数传递、变量赋值等时,它将返回格式化的字符串。

internal class TempratureInfo
{
    public string Name { get; set; }
    public double Temprature { get; set; }

    public override string ToString()
    {
        return string.Format("Temprature in {0} is currently {1}", Name, Temprature);
    }
}

示例实现:

private static void Main(string[] args)
    {
        List<TempratureInfo> unitedKingdomTempratures = new List<TempratureInfo>()
            {
                {new TempratureInfo() { Name = "Wales", Temprature = 10.0}},
                {new TempratureInfo() { Name = "England", Temprature = 55.0}},
                {new TempratureInfo() { Name = "Scotland", Temprature = 22.0}},
                {new TempratureInfo() { Name = "Northen Ireland", Temprature = 4.0}}
            };

        Console.WriteLine("Hottest: " + FindHighestTemprature(unitedKingdomTempratures).Name);
        Console.WriteLine("Coldest: " + FindLowestTemprature(unitedKingdomTempratures).Name);

        Console.ReadLine();
    }
于 2013-01-17T21:20:38.333 回答