从2维列表C#返回最大值+名称

时间:2013-01-17 20:57:08

标签: c#

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

这就是我所做的。

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 ^ _ ^

5 个答案:

答案 0 :(得分: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;
}

正如您所看到的,主要观点是返回Info而不是double

答案 1 :(得分: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);

答案 2 :(得分: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;

答案 3 :(得分: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();;
    }

答案 4 :(得分: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();
    }