在静态类中返回多个值

时间:2012-07-26 11:42:26

标签: c# asp.net string linq return

如何在以下类中返回FirstName和Surname?

public static string GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).Single();

    return ??;
} 

7 个答案:

答案 0 :(得分:6)

您可以返回强类型类,动态对象或元组。 我更喜欢返回一个强类型的类。

使用dynamic类型的问题是你没有得到 仅在运行时的intellisense和exception。

元组的问题在于它没有告诉你什么 你回来了。您或其他开发人员必须阅读该方法 要知道姓名和姓氏是什么。

示例

public class MyResult
{
    public string Name { get; set; }
    public string Surname { get; set; }
}

public static MyResult GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new MyResult{ Name = p.FirstName, Surname = p.Surname }).Single();

    return q;
} 

更新

我建议使用SingleOrDefault代替Single。这将确保你 如果帐户不存在而不是抛出异常,则获得null结果。

//
select new MyResult{ Name = p.FirstName, Surname = p.Surname }).SingleOrDefault();
//

答案 1 :(得分:4)

如果您不想为返回类型定义新对象,可以使用Tuple<string, string>

答案 2 :(得分:1)

通过引用传入两个对象,您可以设置它们。

改为使其成为一个尝试函数,作为较少代码气味版本的例子

public static bool TryGetAccount(int AccountId, out String FirstName, out String Surname)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).SingleOrDefault();


    FirstName=(q==null) ? null: q.Name;
    Surname=(q==null) ? null: q.Surname;
    return q!=null;
} 

现在你可以做到

string firstName;
string surname;

if (TryGetAccount(id, out firstName,out surname)) {
  // firstName now equals the first name and surname now equals the surname
} else {
  // Deal with value not found

}

答案 3 :(得分:1)

另一个(不是最好:))选项是返回一个数组:

public static string[] GetAccount(int AccountId)
{        
    LinqSqlDataContext contextLoad = new LinqSqlDataContext();

    var q = (from p in contextLoad.MyAccounts
             where p.AccountId == AccountId
             select new { Name = p.FirstName, Surname = p.Surname }).Single();

    return new []{q.Name, q.Surname};
} 

答案 4 :(得分:0)

如果您使用.Net 4,则可以返回动态而不是字符串,并直接从返回的对象中获取这两个值。

答案 5 :(得分:0)

如果您不介意以这种方式使用retunred类型,将它返回Tuples怎么样tuple.Item1,tuple.Item2

答案 6 :(得分:0)

您可以使用Hashtable来逃避创建新的结果类。 像这样:

  public static Hashtable GetAccount(int AccountId)
    {        
       LinqSqlDataContext contextLoad = new LinqSqlDataContext();

         var q = (from p in contextLoad.MyAccounts
         where p.AccountId == AccountId
         select new { Name = p.FirstName, Surname = p.Surname }).Single();

        return new Hashtable(q.FirstName, q.Surname);
    } 

您可以通过FirstName作为密钥来获取姓氏。