代码之家  ›  专栏  ›  技术社区  ›  Nowshin

使用c从主应用程序类中的另一个方法获取两个结果#

  •  0
  • Nowshin  · 技术社区  · 9 年前

    我正在尝试编写一个c#代码,通过它我想从web api获取图像,并从api获取图像的标题。我实现了一个名为GetImage的方法,并尝试从中返回两个结果(图像和标题)。然而,我写了一段代码,但由于我是处理这种情况的新手,我不知道在这种情况下该怎么办。

    包含方法的My Image服务类是-

    public class ImageService
    {
        public string GetImage(string name)
        {                
            string result1;
            string result2;
    
            using (WebClient client = new WebClient())
            {
                var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
                string requestUrl = string.Format(uri, name);
                var response = client.DownloadString(new Uri(uri));
                var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
                var firstKey = responseJson.query.pages.First().Key;
                result1 = responseJson.query.pages[firstKey].thumbnail.source;
                result2 = responseJson.query.pages[firstKey].title;
    
                var hash = uri.GetHashCode();
    
            }
            return result1,result2; //showing error
        }
    }
    

    现在,我想在图片框和标签中显示结果的Form1.cs是-

    public partial class Form1 : Form
    {
        private readonly ImageService _imageService;
        public Form1()
        {            
            _imageService = new ImageService();
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text));
            label1.Text = _imageService.GetImage(textBox1.Text);// not working
        }
    }
    
    8 回复  |  直到 9 年前
        1
  •  4
  •   Steve    9 年前

    最好的方法是创建一个新的类来保存您需要的详细信息并返回。这样,如果需要添加更多信息,可以将其添加到类中。

    例如:

    public class ImageInfo
    {
        public string Title { get; set; }
        public string Image { get; set; }
    }
    

    然后方法返回类:

    public ImageInfo GetImage(string name)
    {                
        ImageInfo info = new ImageInfo();
    
        using (WebClient client = new WebClient())
        {
            var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
            string requestUrl = string.Format(uri, name);
            var response = client.DownloadString(new Uri(uri));
            var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
            var firstKey = responseJson.query.pages.First().Key;
            info.Image = responseJson.query.pages[firstKey].thumbnail.source;
            info.Title = responseJson.query.pages[firstKey].title;
    
            var hash = uri.GetHashCode();
    
        }
        return info;
    }
    
        2
  •  3
  •   Irshad Kredns    9 年前

    只能从函数返回1个值。因此,要解决这个问题,您有两个选择:

    • 使用 out 函数的参数
    • 返回具有2个属性的自定义对象

    自定义对象解决方案:

    public class ImageResult
    {
        string ImageUrl { get; set; }
        string Title { get; set; }
    }
    
    public ImageResult GetImage(string imageTitle)
    {                
        ImageResult result = new ImageResult();
    
        using (WebClient client = new WebClient())
        {
            var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+imageTitle;
            string requestUrl = string.Format(uri, imageTitle);
            var response = client.DownloadString(new Uri(uri));
            var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
            var firstKey = responseJson.query.pages.First().Key;
    
            result.ImageUrl = responseJson.query.pages[firstKey].thumbnail.source;
            result.Title = responseJson.query.pages[firstKey].title;
    
            var hash = uri.GetHashCode();
    
        }
        return result;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
    
        var imageResult = _imageService.GetImage(textBox1.Text);
    
        pictureBox1.LoadAsync(imageResult.ImageUrl);
        label1.Text = imageResult.Title;
    }
    
        3
  •  2
  •   ChrisF toni    9 年前

    这样的方法不能返回多个值。

    将方法配置文件更改为:

    private Tuple<string, string> GetImage(string name)
    

    以及返回语句:

    return new Tuple<string, string>(result1, result2);
    

    然后,您可以从Tuple中提取每个结果:

    var resultTuple = _imageService.GetImage(textBox1.Text);
    label1.Text = resultTuple.Item1;
    label2.Text = resultTuple.Item2;
    
        4
  •  2
  •   foobar    9 年前

    有几个选项可供选择。

    您可以像这样返回字典:

            public Dictionary<string, string> GetImage(string name)
            {
                string result1;
                string result2;
    
                using (WebClient client = new WebClient())
                {
                        var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
                        string requestUrl = string.Format(uri, name);
                        var response = client.DownloadString(new Uri(uri));
                        var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
                        var firstKey = responseJson.query.pages.First().Key;
                        result1 = responseJson.query.pages[firstKey].thumbnail.source;
                        result2 = responseJson.query.pages[firstKey].title;
    
                        var hash = uri.GetHashCode();
    
                }
                Dictionary<string, string> dictionary = new Dictionary<string, string>();
                dictionary.Add("Source", result1);
                dictionary.Add("Title", result2);
                return dictionary;
            }
    

    然后你可以像这样使用字典:

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            Dictionary<string, string> imageDictionary = _imageService.GetImage(textBox1.Text);
            pictureBox1.LoadAsync(imageDictionary["Source"]);
            label1.Text = imageDictionary["Title"];
        }
    

    您也可以返回List,或者使用out参数,或者如其他答案所示,您可以创建一个自定义类并返回它。

        5
  •  1
  •   Irshad Kredns    9 年前

    由于方法只能有一个返回值,因此可以使用 out 参数返回附加值。

    public string GetImage(string name, out string title)
    {
        string result1;
    
        using (WebClient client = new WebClient())
        {
            var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
            string requestUrl = string.Format(uri, name);
            var response = client.DownloadString(new Uri(uri));
            var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
            var firstKey = responseJson.query.pages.First().Key;
            result1 = responseJson.query.pages[firstKey].thumbnail.source;
            title = responseJson.query.pages[firstKey].title;
    
            var hash = uri.GetHashCode();
         }
         return result1;
     }
    

    用法

    private void button1_Click(object sender, EventArgs e)
    {
         string title = string.Empty;
    
         pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
         pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text, out title));
         label1.Text = title;
    }
    
        6
  •  1
  •   Juliano Oliveira    9 年前

    使用元组。 实例

    using System;
    
    class Program
    {
        static void Main()
        {
        // Create three-item tuple.
        Tuple<int, string, bool> tuple =
            new Tuple<int, string, bool>(1, "cat", true);
        // Access tuple properties.
        if (tuple.Item1 == 1)
        {
            Console.WriteLine(tuple.Item1);
        }
        if (tuple.Item2 == "dog")
        {
            Console.WriteLine(tuple.Item2);
        }
        if (tuple.Item3)
        {
            Console.WriteLine(tuple.Item3);
        }
        }
    }
    

    字体 http://www.dotnetperls.com/tuple

        7
  •  1
  •   nano    9 年前

    您可以使用类:

    public class Image
    {
        public string Url { get; internal set; }
        public string Title { get; internal set; }
    
        public Image(string name)
        {
           string result1;
           string result2;
    
            using (WebClient client = new WebClient())
            {
                var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
                string requestUrl = string.Format(uri, name);
                var response = client.DownloadString(new Uri(uri));
                var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
                var firstKey = responseJson.query.pages.First().Key;
                result1 = responseJson.query.pages[firstKey].thumbnail.source;
                result2 = responseJson.query.pages[firstKey].title;
    
                var hash = uri.GetHashCode();
    
            }
            Url = result1;
            Title = result2;
        }
    }
    

    并像这样使用:

    private void button1_Click(object sender, EventArgs e)
    {
        var img = _imageService.GetImage(textBox1.Text);
    
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.LoadAsync(img.Url);
        label1.Text = img.Title;
    }
    
        8
  •  0
  •   Meirion Hughes    9 年前

    匿名:

    dynamic Get()
    {
        return new {Url = "url", Image = "image"};
    }
    
    var result = Get();
    
    var url = (string) result.Url;
    

    尽管如此,这通常更适合LINQ。